std::mdspan是C++23引入的多维数组视图,不拥有数据,仅提供对连续内存的多维索引访问,支持行优先、列优先等布局,适用于科学计算与图像处理,具有零开销抽象和高安全性。

std::mdspan 是 C++23 引入的一个重要工具,用于表示多维数组的非拥有视图。它不管理数据的生命周期,只提供对已有内存块的多维索引访问方式,类似于 Python 中的 NumPy 切片或 Fortran 的数组视图。
什么是 std::mdspan
std::mdspan 指的是“multi-dimensional span”,即多维跨度。它允许你用多个下标(如 [i][j][k])来访问一段连续内存或自定义布局的数据,而无需复制原始数据。它常用于科学计算、图像处理、张量操作等需要高效多维访问的场景。
与 std::span 只支持一维不同,std::mdspan 支持任意维度(编译时或运行时指定),并且可以配合不同的布局策略使用。
关键特性:不拥有数据:只持有指向外部内存的指针 支持静态和动态维度大小 可定制内存布局(行优先、列优先、子矩阵等) 轻量级、零开销抽象(在优化后基本不产生额外运行时成本)
如何使用 std::mdspan
创建一个 std::mdspan 需要三个要素:原始数据指针、各维度的大小、以及可选的布局策略。
立即学习“C++免费学习笔记(深入)”;
示例:二维矩阵视图
#include #include int data[] = {1, 2, 3, 4, 5, 6};int main() { // 创建一个 2x3 的视图 std::mdspan mat(data, 2, 3); for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { std::cout << mat[i, j] << " "; // 使用逗号运算符索引 } std::cout << "n"; }}
输出为:
1 2 3 4 5 6
注意:索引使用 mat[i, j] 而不是 mat[i][j] —— 这是通过重载逗号运算符实现的 C++ 技巧。
支持的布局类型
std::mdspan 允许你指定数据在内存中的排列方式:
std::layout_left:列优先(类似 Fortran 或 MATLAB) std::layout_right:行优先(类似 C/C++ 原生数组) std::layout_stride:支持步幅的通用布局(可用于切片、转置等)示例:使用列优先布局
std::mdspan col_mat(data, std::extents{}, std::layout_left{});// 现在 data[0] 对应 (0,0),data[1] 对应 (1,0),依此类推
应用场景与优势
std::mdspan 特别适合以下情况:
封装 C 风格多维数组,提升安全性和可读性 传递子区域给算法函数(如矩阵分块计算) 对接 GPU 或加速器内存(配合 custom accessors) 实现张量库、线性代数组件的基础构件
由于它是非拥有的,传参代价极小(通常是几个整数 + 一个指针),且能被编译器高度优化。
基本上就这些。std::mdspan 填补了 C++ 在多维视图方面的长期空白,让多维数据操作变得更安全、直观和高效。
以上就是C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1487265.html
微信扫一扫
支付宝扫一扫