namespace std::simd {
template<class V = /*see below*/,
ranges::contiguous_range R,
class... Flags>
requires ranges::sized_range<R>
constexpr V
unchecked_load(R&& r,
flags<Flags...> f = {}); // (1) C++26
template<class V = /*see below*/,
ranges::contiguous_range R,
class... Flags>
requires ranges::sized_range<R>
constexpr V
unchecked_load(R&& r,
const typename V::mask_type& mask,
flags<Flags...> f = {}); // (2) C++26
template<class V = /*see below*/,
contiguous_iterator I,
class... Flags>
constexpr V
unchecked_load(I first,
iter_difference_t<I> n,
flags<Flags...> f = {}); // (3) C++26
template<class V = /*see below*/,
contiguous_iterator I,
class... Flags>
constexpr V
unchecked_load(I first,
iter_difference_t<I> n,
const typename V::mask_type& mask,
flags<Flags...> f = {}); // (4) C++26
template<class V = /*see below*/,
contiguous_iterator I,
sized_sentinel_for<I> S,
class... Flags>
constexpr V
unchecked_load(I first,
S last,
flags<Flags...> f = {}); // (5) C++26
template<class V = /*see below*/,
contiguous_iterator I,
sized_sentinel_for<I> S,
class... Flags>
constexpr V
unchecked_load(I first,
S last,
const typename V::mask_type& mask,
flags<Flags...> f = {}); // (6) C++26
}
概要
連続したメモリ領域からbasic_vecへ、要素をまとめて読み込む。境界チェックをおこなわない高速な読み込みである。
入力範囲の指定方法によって、以下のオーバーロードがある。
- (1), (2) : 連続範囲
r(std::vectorやstd::array、std::spanなど)から読み込む - (3), (4) : 先頭イテレータ
firstと要素数nで指定した範囲から読み込む - (5), (6) : 先頭イテレータ
firstと番兵lastで指定した範囲から読み込む
maskを受け取るオーバーロード (2), (4), (6) は、マスクの各要素がtrueである位置の要素のみを読み込み、falseの位置は値初期化された値(0など)とする。
V: 結果のデータ並列型。省略した場合はbasic_vec<std::ranges::range_value_t<R>>(先頭イテレータ版ではbasic_vec<iter_value_t<I>>)が使われるf: 読み込みの動作を指定するflagsオブジェクト。既定値はflag_default。要素型が異なるメモリからの変換読み込みを許可するflag_convertや、メモリのアライメントを仮定してより効率的な読み込みをおこなうflag_aligned/flag_overaligned<N>を指定できる
適格要件
std::ranges::size(r)が定数式である場合、std::ranges::size(r) >= V::size()であること。
事前条件
- (3), (4) : 範囲
[first, first + n)が有効な範囲であること - (5), (6) : 範囲
[first, last)が有効な範囲であること - すべてのオーバーロードにおいて、
std::ranges::size(r) >= V::size()であること。すなわち、入力範囲の要素数が結果の要素数以上であること
効果
partial_load<V>(r, mask, f)を返すことと等価である。ただしmaskを受け取らないオーバーロードではmaskはV::mask_type(true)(すべてtrue)とみなす。
戻り値
読み込んだ結果のbasic_vecオブジェクト。
例
#include <simd>
#include <array>
#include <print>
namespace simd = std::simd;
int main()
{
std::array<int, 4> data = {1, 2, 3, 4};
// 配列からデータ並列型へ読み込む
auto v = simd::unchecked_load<simd::vec<int, 4>>(data);
for (int i = 0; i < v.size(); ++i) {
std::print("{} ", v[i]);
}
std::println("");
}
出力
1 2 3 4
バージョン
言語
- 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で