名前空間
変種
操作

std::assume_aligned

提供: cppreference.com
< cpp‎ | memory
 
 
 
動的メモリ管理
スマートポインタ
(C++11)
(C++11)
(C++11)
(C++17未満)
(C++11)
アロケータ
メモリリソース
未初期化記憶域
(C++17)
ガベージコレクションサポート
その他
(C++20)
(C++11)
(C++11)
assume_aligned
(C++20)
C のライブラリ
低水準のメモリ管理
 
ヘッダ <memory> で定義
template< std::size_t N, class T >
[[nodiscard]] constexpr T* assume_aligned(T* ptr);
(C++20以上)

ptr の指す先のオブジェクトが少なくとも N にアラインされていることを処理系に伝えます。 処理系はより効率的なコードを生成するためにこの情報を使用するかもしれませんが、処理系はそのオブジェクトが assume_aligned の戻り値を通してアクセスされた場合にのみその仮定を行うかもしれません。

N が2の乗数でない場合、プログラムは ill-formed です。 ptrT 型 (すべての段における cv 修飾を無視します) のオブジェクトを指していない場合、またはオブジェクトのアライメントが少なくとも N でない場合、動作は未定義です。

[編集] 戻り値

ptr

[編集] 例外

何も投げません。

[編集] ノート

assume_aligned によって有効になる最適化の利点を確実に得るためには、その戻り値を通してオブジェクトをアクセスすることが重要です。

void f(int* p) {
   int* p1 = std::assume_aligned<256>(p);
   // アライメントの仮定による利点を確実に得るためには、 p ではなく p1 を使用します。
   // しかし、 p1 が使用されるかどうかにかかわらず、
   // もし p がアラインされていなければ、プログラムは未定義動作です。
}

アライメントの仮定が実際に保たれていることを保証するのはプログラマの責任です。 assume_aligned の呼び出しによってコンパイラがそれを検証したり強制したりすることはありません。