- simd[meta header]
- std::simd[meta namespace]
- function template[meta id-type]
- cpp26[meta cpp]
namespace std::simd {
template<simd-vec-type V>
constexpr V
expand(const V& v,
const typename V::mask_type& selector,
const V& original = {}); // (1) C++26
template<simd-mask-type V>
constexpr V
expand(const V& v,
const type_identity_t<V>& selector,
const V& original = {}); // (2) C++26
}- simd-vec-type[link /reference/simd/simd-vec-type.md]
- simd-mask-type[link /reference/simd/simd-mask-type.md]
expandは、compressの逆操作を行う関数である。先頭に詰められたデータ並列オブジェクトvの要素を、マスクselectorがtrueである位置へ順番に展開する。
selectorがtrueである位置には、vの先頭から昇順に要素が配置される。selectorがfalseである位置には、originalの対応する要素が配置される。
i番目の要素について、selector[i]がtrueならばvの対応する要素、falseならばoriginal[i]で初期化されたデータ並列オブジェクト。
投げない
#include <simd>
#include <print>
namespace simd = std::simd;
int main()
{
// 先頭に詰められた値
simd::vec<int, 4> v([](int i) { return i + 1; }); // {1, 2, 3, 4}
// trueの位置へ v の先頭から順に展開する。falseの位置は original(=0) となる
simd::vec<int, 4>::mask_type selector([](int i) { return i % 2 == 1; });
// {false, true, false, true}
auto r = simd::expand(v, selector); // {0, 1, 0, 2}
for (int i = 0; i < r.size(); ++i)
std::print("{} ", r[i]);
std::println("");
}- simd::expand[color ff0000]
- simd::vec[link basic_vec.md]
0 1 0 2
- C++26
- Clang: 22 [mark noimpl]
- GCC: 16.1 [mark noimpl]
- Visual C++: 2026 Update 2 [mark noimpl]
- P1928R15 std::simd — merge data-parallel types from the Parallelism TS 2
- C++26で
std::simdライブラリが追加された
- C++26で
- P2664R11 Proposal to extend
std::simdwith permutation API- C++26で置換API(
expand)が追加された
- C++26で置換API(