名前空間
変種
操作

std::assume_aligned

提供: cppreference.com
< cpp‎ | memory
 
 
ユーティリティライブラリ
汎用ユーティリティ
日付と時間
関数オブジェクト
書式化ライブラリ(C++20)
(C++11)
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)
スワップと型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
一般的な語彙の型
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等文字列変換
(C++17)
(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 の呼び出しによってコンパイラがそれを検証したり強制したりすることはありません。

close