C/C++ 中 mdspan 介紹與使用示例
C/C++ 中的 mdspan 介紹與使用
mdspan
是多維數(shù)組視圖的一個現(xiàn)代 C++ 抽象,它是 C++23 標準引入的一個重要特性,旨在提供靈活、高效的多維數(shù)組操作方式。
什么是 mdspan
mdspan
(Multi-Dimensional Span) 是一個非擁有的多維數(shù)組視圖,它:
- 不管理內(nèi)存,只提供對現(xiàn)有數(shù)據(jù)的多維視圖
- 支持任意維度的數(shù)組
- 提供靈活的內(nèi)存布局描述
- 是 C++ 標準庫的一部分 (C++23)
基本用法
包含頭文件
#include <mdspan>
創(chuàng)建一個 mdspan
#include <mdspan> #include <vector> #include <iostream> int main() { std::vector<int> data = {1, 2, 3, 4, 5, 6}; // 創(chuàng)建一個 2x3 的 mdspan 視圖 std::mdspan mat{data.data(), 2, 3}; // 訪問元素 std::cout << mat(1, 2) << '\n'; // 輸出 6 }
高級特性
自定義布局
#include <mdspan> int main() { int data[6] = {1, 2, 3, 4, 5, 6}; // 使用行優(yōu)先布局 (C風格) std::mdspan mat_c{data, std::extents{2, 3}, std::layout_right{}}; // 使用列優(yōu)先布局 (Fortran風格) 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}}}; }
動態(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)和動態(tài)維度 std::mdspan<int, std::extents<std::dynamic_extent, 3, std::dynamic_extent>> mixed_span{data, 2, 4}; // 完全動態(tài)維度 std::mdspan<int, std::extents<std::dynamic_extent, std::dynamic_extent>> dynamic_span{data, 2, 3}; }
實際應(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)點
- 零成本抽象:與原始指針操作性能相當
- 類型安全:比原始指針更安全
- 靈活性:支持多種內(nèi)存布局
- 可組合性:可以與標準庫其他組件良好配合
注意事項
mdspan
不管理內(nèi)存,只是視圖- 需要確保底層數(shù)據(jù)在
mdspan
使用期間有效 - C++23 特性,需要較新的編譯器支持
mdspan
為 C++ 中的多維數(shù)組操作提供了現(xiàn)代化、高效的解決方案,特別適用于科學計算、圖像處理等領(lǐng)域。
到此這篇關(guān)于C/C++ 中 mdspan 介紹與使用的文章就介紹到這了,更多相關(guān)c++ map使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)LeetCode(111.二叉樹的最小深度)
這篇文章主要介紹了C++實現(xiàn)LeetCode(111.二叉樹的最小深度),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07理解C++編程中的std::function函數(shù)封裝
這篇文章主要介紹了理解C++編程中的std::function函數(shù)封裝,std::function是C++11標準中的新特性,需要的朋友可以參考下2016-04-04C語言實現(xiàn)十六進制轉(zhuǎn)換為十進制的方法詳解
這篇文章主要為大家詳細介紹了C語言實現(xiàn)十六進制轉(zhuǎn)換為十進制的方法,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下2022-11-11C語言結(jié)構(gòu)體中內(nèi)存對齊的問題理解
內(nèi)存對齊”應(yīng)該是編譯器的“管轄范圍”。編譯器為程序中的每個“數(shù)據(jù)單元”安排在適當?shù)奈恢蒙?。但是C語言的一個特點就是太靈活,太強大,它允許你干預(yù)“內(nèi)存對齊”。如果你想了解更加底層的秘密,“內(nèi)存對齊”對你就不應(yīng)該再模糊了2022-02-02