ISO/IEC 14882:2011の条項3.11-位置合わせ

1871 ワード

3.11位置合わせ
1、オブジェクトタイプには、位置合わせの要件があります(3.9.1,3.9.2)この要求は、そのタイプのオブジェクトが割り当てられるアドレスに制限がある場合がある.1つの整列は、1つの与えられたオブジェクトが割り当てられることができる連続アドレス(例えば、1つのオブジェクトが4バイト整列のアドレスに割り当てられる場合、例えば0,4が連続アドレス)間のバイト数を表す定義された整数値である.オブジェクトタイプは、このタイプの各オブジェクトに1つの位置合わせ要件を使用します.位置合わせインジケータを使用すると、より厳密な位置合わせが要求されます(7.6.2).
2、基本的な位置合わせは、すべてのコンテキストでサポートされている最大位置合わせを実現する1つの位置合わせ以下で表される.最大整列はalignof(std::max_align_t)(18.2)に等しい.1つのタイプに必要な整列は、完全なオブジェクトとして使用される場合と、サブオブジェクトとして使用される場合で異なる場合があります.〔例:
struct B { long double d; };
struct D : virtual B { char c; };

Dが完全なオブジェクトタイプである場合、タイプBのサブオブジェクトがあり、long doubleで適切な位置合わせを行う必要があります.Dが別のオブジェクトとしてサブオブジェクトとして現れ、Bもダミーベースクラスとして現れる場合、Bサブオブジェクトは異なるサブオブジェクトの部分であり、Dサブオブジェクトの位置合わせの要件を低減することができる.例終了]alignofオペレータの結果は、完全なオブジェクトの場合の位置合わせ要件を反映します.
3、拡張位置合わせはalignof(std::max_align_t)よりも大きな位置合わせで表される.拡張アライメントがサポートされているかどうか、およびどのコンテキスト環境でサポートされているかは、実装によって定義されています(7.6.2).拡張アライメントに必要なタイプの1つは、オーバーアライメントタイプです.〔注意:各オーバーアライメントタイプは、拡張アライメントに適用されるクラスタイプ(非静的データメンバーを使用する場合があります).
4、stdとして位置合わせ::size_tタイプの値で表します.有効な実パラメータには、基本タイプとして機能するalignof式によって返される値と、実装によって定義された追加の値の非空の集合のみが含まれます.各位置合わせ値は、負でない2の整数べき乗である必要があります.
5、位置合わせには、弱いものから強いもの、または厳密な位置合わせまでの順序があります.厳密な位置合わせには、より大きな位置合わせ値があります.1つの位置合わせ要件を満たすアドレスも、より弱い有効な位置合わせ要件を満たす.
6、完全なタイプの整列要件は、alignof式を使用して問合せできます(5.3.6).また、タイプchar、signed char、unsigned charは、最も弱い整列要件を持つ必要があります.〔注:これにより、文字タイプが整列した記憶領域のベースタイプとして使用できるようになります(7.6.2).
7、位置合わせを比較することは意味があり、明らかな結果を提供する.
-2つの位置合わせの値が等しい場合、それらは等しい.
-2つの位置合わせの値が等しくない場合、それらは等しくありません.
-1つの位置合わせの値が他の値より大きい場合は、より厳密な位置合わせを表します.
8、[注意:実行時のポインタ整列関数(20.6.5)は、1つのキャッシュ内で整列したポインタを取得するために使用することができ、ライブラリ内の整列したストレージテンプレート(20.9.7.6)は、整列したストレージを取得するために使用することができる.——注意終了]
9.特定のコンテキストにおける特定の拡張位置合わせの1つの要求が1つの実装によってサポートされていない場合、プログラムは不良である.また、動的に格納された実行時に割り当てられた要求の1つであり、その要求の位置合わせが満たされない場合は、割り当てに失敗するとみなされるべきである.