namespace std::simd {
template<class... Flags>
struct flags {
template<class... Other>
friend consteval auto operator|(flags, flags<Other...>);
};
inline constexpr flags<> flag_default{};
inline constexpr flags</*convert-flag*/> flag_convert{};
inline constexpr flags</*aligned-flag*/> flag_aligned{};
template<std::size_t N> requires (has_single_bit(N))
constexpr flags</*overaligned-flag*/<N>> flag_overaligned{};
}
概要
flagsは、basic_vecの読み込み/書き込み(unchecked_load・unchecked_storeや、範囲を取るコンストラクタなど)の動作を制御するためのフラグをまとめて表すクラステンプレートである。整数のビットフラグのように、operator|で複数のフラグを合成できる。
通常は、以下の定義済みフラグオブジェクトを使用する。
| フラグ | 説明 |
|---|---|
flag_default |
既定の動作(フラグなし)。要素型とメモリの型が一致し、アライメント要件を仮定しない |
flag_convert |
メモリの要素型がbasic_vecの要素型と異なる場合に、変換読み込み/書き込みを許可する |
flag_aligned |
メモリ先頭がbasic_vecのアライメント要件(alignment_v)を満たしていると仮定する |
flag_overaligned<N> |
メモリ先頭がNバイト境界にアライメントされていると仮定する(Nは2の冪) |
メンバ関数
非メンバ(Hidden friends)関数
| 名前 | 説明 | 対応バージョン |
|---|---|---|
operator| |
2つのflagsを合成する |
C++26 |
例
#include <simd>
#include <array>
#include <print>
namespace simd = std::simd;
int main()
{
std::array<float, 4> data = {1.0f, 2.0f, 3.0f, 4.0f};
// アライメント済みメモリからの読み込みを指定
simd::vec<float, 4> v = simd::unchecked_load(data, simd::flag_aligned);
std::print("{}", v[0]);
std::println("");
}
出力
1
バージョン
言語
- C++26
処理系
- Clang: 22 ❌
- GCC: 16.1 ❌
- Visual C++: 2026 Update 2 ❌
関連項目
参照
- P1928R15 std::simd — merge data-parallel types from the Parallelism TS 2
- C++26で
std::simdライブラリが追加された
- C++26で