yohhoyの日記

技術的メモをしていきたい日記

std::submdspanとメモリレイアウト変換

C++2c(C++26)多次元部分ビューstd::submdspan(→id:yohhoy:20240201)によるメモリレイアウト変換のチートシート

変換結果std::mdspan<T,E,L,A>(→id:yohhoy:20230303)のレイアウトポリシーLは、変換元レイアウトマッピングsubmdspan_mappingカスタマイズポイントにより下記ルールにて導出される:

  • layout_left, layout_rightのとき
    1. レイアウト互換ならば、layout_{left,right}を維持
    2. レイアウト互換ならば、layout_{left,right}_paddedに変換(降格)
    3. layout_strideに変換(降格)
  • layout_left_padded, layout_right_paddedのとき
    1. 変換元が0次元(→id:yohhoy:20230309)のとき、layout_{left,right}_paddedを維持*1
    2. レイアウト互換ならば、layout_{left,right}に変換(昇格)*2
    3. レイアウト互換ならば、layout_{left,right}_paddedを維持
    4. layout_strideに変換(降格)
  • layout_strideのとき
    1. layout_strideを維持

ノート:C++2c標準ライブラリ提供メモリレイアウト型は、その型情報として layout_LRlayout_LR_paddedlayout_stride の順で強い制約条件を表す(LR := leftright)。

関連URL

*1:レイアウトとしては layout_{left,right} 型に昇格可能だが、他メモリレイアウト型における変換元=0次元の挙動に揃えたと考えられる。

*2:この変換条件を満たすのは、変換先=1次元以下かつ要素連続配置が保証されるケースに限られる。