You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:22:51