C/C++ 中 mdspan 介紹與使用示例
C/C++ 中的 mdspan 介紹與使用
mdspan 是多維數(shù)組視圖的一個(gè)現(xiàn)代 C++ 抽象,它是 C++23 標(biāo)準(zhǔn)引入的一個(gè)重要特性,旨在提供靈活、高效的多維數(shù)組操作方式。
什么是 mdspan
mdspan (Multi-Dimensional Span) 是一個(gè)非擁有的多維數(shù)組視圖,它:
- 不管理內(nèi)存,只提供對(duì)現(xiàn)有數(shù)據(jù)的多維視圖
- 支持任意維度的數(shù)組
- 提供靈活的內(nèi)存布局描述
- 是 C++ 標(biāo)準(zhǔn)庫(kù)的一部分 (C++23)
基本用法
包含頭文件
#include <mdspan>
創(chuàng)建一個(gè) mdspan
#include <mdspan>
#include <vector>
#include <iostream>
int main() {
std::vector<int> data = {1, 2, 3, 4, 5, 6};
// 創(chuàng)建一個(gè) 2x3 的 mdspan 視圖
std::mdspan mat{data.data(), 2, 3};
// 訪問元素
std::cout << mat(1, 2) << '\n'; // 輸出 6
}高級(jí)特性
自定義布局
#include <mdspan>
int main() {
int data[6] = {1, 2, 3, 4, 5, 6};
// 使用行優(yōu)先布局 (C風(fēng)格)
std::mdspan mat_c{data, std::extents{2, 3}, std::layout_right{}};
// 使用列優(yōu)先布局 (Fortran風(fēng)格)
std::mdspan mat_f{data, std::extents{2, 3}, std::layout_left{}};
// 自定義跨步布局
std::mdspan mat_stride{data, std::extents{2, 3}, std::layout_stride{std::array{1, 2}}};
}動(dòng)態(tài)與靜態(tài)維度
#include <mdspan>
int main() {
int data[24];
// 完全靜態(tài)維度
std::mdspan<int, std::extents<2, 3, 4>> static_span{data};
// 混合靜態(tài)和動(dòng)態(tài)維度
std::mdspan<int, std::extents<std::dynamic_extent, 3, std::dynamic_extent>> mixed_span{data, 2, 4};
// 完全動(dòng)態(tài)維度
std::mdspan<int, std::extents<std::dynamic_extent, std::dynamic_extent>> dynamic_span{data, 2, 3};
}實(shí)際應(yīng)用示例
矩陣乘法
#include <mdspan>
#include <vector>
#include <iostream>
template <typename T, typename ExtsA, typename LayA, typename AccA,
typename ExtsB, typename LayB, typename AccB,
typename ExtsC, typename LayC, typename AccC>
void matrix_multiply(
std::mdspan<T, ExtsA, LayA, AccA> a,
std::mdspan<T, ExtsB, LayB, AccB> b,
std::mdspan<T, ExtsC, LayC, AccC> c) {
for (size_t i = 0; i < c.extent(0); ++i) {
for (size_t j = 0; j < c.extent(1); ++j) {
c(i, j) = 0;
for (size_t k = 0; k < a.extent(1); ++k) {
c(i, j) += a(i, k) * b(k, j);
}
}
}
}
int main() {
std::vector<int> a_data(2*3, 1); // 2x3 矩陣,全1
std::vector<int> b_data(3*4, 2); // 3x4 矩陣,全2
std::vector<int> c_data(2*4); // 2x4 結(jié)果矩陣
auto a = std::mdspan(a_data.data(), 2, 3);
auto b = std::mdspan(b_data.data(), 3, 4);
auto c = std::mdspan(c_data.data(), 2, 4);
matrix_multiply(a, b, c);
// 輸出結(jié)果
for (size_t i = 0; i < c.extent(0); ++i) {
for (size_t j = 0; j < c.extent(1); ++j) {
std::cout << c(i, j) << ' ';
}
std::cout << '\n';
}
}優(yōu)點(diǎn)
- 零成本抽象:與原始指針操作性能相當(dāng)
- 類型安全:比原始指針更安全
- 靈活性:支持多種內(nèi)存布局
- 可組合性:可以與標(biāo)準(zhǔn)庫(kù)其他組件良好配合
注意事項(xiàng)
mdspan不管理內(nèi)存,只是視圖- 需要確保底層數(shù)據(jù)在
mdspan使用期間有效 - C++23 特性,需要較新的編譯器支持
mdspan 為 C++ 中的多維數(shù)組操作提供了現(xiàn)代化、高效的解決方案,特別適用于科學(xué)計(jì)算、圖像處理等領(lǐng)域。
到此這篇關(guān)于C/C++ 中 mdspan 介紹與使用的文章就介紹到這了,更多相關(guān)c++ map使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用C語(yǔ)言實(shí)現(xiàn)交換整數(shù)的奇數(shù)位和偶數(shù)位
在C語(yǔ)言中,要交換一個(gè)整數(shù)的二進(jìn)制位中的奇數(shù)位和偶數(shù)位,重點(diǎn)需要理解位操作,當(dāng)我們談?wù)摱M(jìn)制位的奇數(shù)位和偶數(shù)位時(shí),我們是指從右到左數(shù)的位置,本文給大家介紹了使用C語(yǔ)言代碼實(shí)現(xiàn)將一個(gè)整數(shù)的奇數(shù)位和偶數(shù)位交換,需要的朋友可以參考下2025-03-03
C語(yǔ)言實(shí)現(xiàn)大整數(shù)加減運(yùn)算詳解
大數(shù)運(yùn)算,顧名思義,就是很大的數(shù)值的數(shù)進(jìn)行一系列的運(yùn)算。本文通過實(shí)例演示如何進(jìn)行C語(yǔ)言中的大整數(shù)加減運(yùn)算,有需要的可以參考借鑒。2016-08-08
Unity3D實(shí)現(xiàn)經(jīng)典小游戲Pacman
這篇文章主要介紹了基于Unity3D制作一做個(gè)經(jīng)典小游戲Pacman,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Unity3D有一定的幫助,感興趣的小伙伴可以了解一下2021-12-12

