如何在std::mdspan中使用std::layout_stride布局策略
理解std::mdspan的std::layout_stride布局策略
我想了解C++23中std::mdspan的std::layout_stride布局策略的工作原理。目前主流编译器还不支持这个新库类型,但有参考实现可用。不过我在相关项目的Wiki和标准文档P0009r18里,都没找到关于该布局类型的清晰说明。
std::layout_right(默认布局)示例
使用默认的layout_right布局时,程序输出如下:
1 2 3 4 5 6
对应的代码:
std::vector v {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}; std::mdspan<int, std::extents<size_t, 2, 3>, std::layout_right> mv{v.data()}; for (std::size_t r = 0; r < mv.extent(0); r++) { for (std::size_t c = 0; c < mv.extent(1); c++) { std::cout << mv[r, c] << ' '; } std::cout << '\n'; }
std::layout_left布局示例
将布局改为std::layout_left后,输出变为:
1 3 5 2 4 6
对应的代码片段(仅修改布局部分):
std::mdspan<int, std::extents<size_t, 2, 3>, std::layout_left> mv{v.data()};
关于std::layout_stride的疑问
我理解std::layout_stride可以自定义底层序列中的元素步长(比如每行跳2个元素、每列跳3个元素),但找不到相关示例,希望能看到展示其实际工作方式的代码。
更新:std::layout_stride的实际测试示例
基于相关解答,我推导了以下使用layout_stride的代码,并测试了不同步长配置的效果:
1. 等效于layout_right的步长配置
代码:
stdex::mdspan<int, stdex::extents<size_t, stdex::dynamic_extent, stdex::dynamic_extent>, stdex::layout_stride> mv{ v.data(), { stdex::dextents<size_t,2>{2, 3}, std::array<std::size_t, 2>{3, 1}}};
输出:
1 2 3 4 5 6
2. 步长配置为std::array<std::size_t, 2>{1, 1}
输出:
1 2 3 2 3 4
3. 步长配置为std::array<std::size_t, 2>{3, 2}
输出:
1 3 5 4 6 8
4. 步长配置为std::array<std::size_t, 2>{9, 3}
输出:
1 4 7 10 13 16
内容的提问来源于stack exchange,提问作者Marius Bancila
相关产品推荐
相关产品推荐

