std::mdspan是C++23引入的零开销多维数组视图,不拥有数据,仅持指针、尺寸与步长,支持动态/静态维度、自定义布局(如layout_left/layout_right)和访问器,适用于科学计算等高性能场景。

std::mdspan 是 C++23 引入的标准库新特性,它提供了一种轻量、零开销的多维数组视图(multi-dimensional array view),不拥有数据,只持有指向原始内存的指针 + 尺寸 + 步长信息,类似 std::span 的多维扩展。它专为科学计算、数值模拟、图像处理等需要灵活访问高维数据的场景设计,目标是统一接口、提升表达力、避免拷贝、支持自定义布局。
核心设计:视图而非容器
mdspan 本身不分配或管理内存,只“看”已有数据:
- 底层可绑定到普通 C 数组、
std::array、std::vector(连续存储)、甚至 GPU 内存(配合自定义 accessor) - 构造开销为常数时间,无内存分配,无拷贝 —— 真正的 zero-cost 抽象
- 支持运行时维度(
dynamic_extent)和编译时维度(如3),混合使用很常见
关键模板参数:布局与访问器
mdspan 的完整声明是:
template<class ElementType, class Extents, class LayoutPolicy = layout_left, class AccessorPolicy = default_accessor<ElementType>><br> class mdspan;
登录后复制
-
Extents:描述维度数量和各维大小(如
dextents表示二维,大小运行时确定;extents表示 3×4 编译期固定) -
LayoutPolicy:决定元素在内存中的排列顺序。标准提供
layout_left(行优先,C 风格)、layout_right(列优先,Fortran 风格)、layout_stride(完全自定义步长) - AccessorPolicy:控制如何读写元素(默认直接解引用;可扩展支持代理对象、边界检查、原子访问等)
典型用法:从创建到切片
常见操作简洁直观:
- 创建二维视图:
int data[12]; std::mdspan m{data, 3, 4}; // 3×4 行优先 - 获取元素:
m[1, 2](支持多维下标,比m[1][2]更高效且语义清晰) - 子视图(subspan):
auto row0 = m.subspan(0, 1, std::full_extent); // 第0行,返回新的 mdspan,不拷贝数据 - 转置(需 layout_stride):
mdspan<int dextents>, layout_stride> t{data, {4,3}, {1,4}};</int>(把 3×4 行优先数据当 4×3 列优先看待)
为什么对科学计算重要?
传统 C++ 多维数组处理常靠嵌套 vector、手写索引公式或第三方库(如 Eigen、xtensor)。mdspan 填补了标准库空白:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~