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++ 在多维视图方面的长期空白,让多维数据操作变得更安全、直观和高效。










