alignas 指定子 (C++11以上)
型またはオブジェクトのアライメント要件を指定します。
目次 |
[編集]構文
alignas( expression) | |||||||||
alignas( type-id) | |||||||||
alignas( pack... ) | |||||||||
[編集]説明
alignas 指定子は、変数またはビットフィールドでないクラスデータメンバの宣言、またはクラス/構造体/共用体または列挙の宣言または定義に適用できます。 関数の引数や catch 節の例外引数には適用できません。
そのような宣言によって宣言されたオブジェクトまたは型は、その宣言で使用されたすべての alignas
指定子の最も厳しい (大きい) ゼロでない expression と等しいアライメント要件を持ちます。 ただし、それがその型の自然なアライメントを弱める場合は除きます。
ある宣言における最も厳しい (大きい) alignas
が、もしいかなる alignas
指定子もなかったならば持つであろうはずだったアライメントよりも弱い (つまり、その自然なアライメントよりも弱いか、同じオブジェクトまたは型の別の宣言における alignas
よりも弱い) 場合、プログラムは ill-formed です。
struct alignas(8) S {};struct alignas(1) U { S s;};// エラー、 U のアライメントは alignas(1) がなければ 8 のはずです。
alignas(3) のような無効な非ゼロの引数は ill-formed です。
同じ宣言における別の alignas よりも弱い有効な非ゼロのアライメントは無視されます。
alignas(0) は常に無視されます。
[編集]ノート
ISO C11 標準以降、 C 言語では _Alignas キーワードが使用でき、このキーワードに展開されるプリプロセッサマクロとしてヘッダ <stdalign.h> で alignas が定義されていますが、 C++ では alignas はキーワードであり、ヘッダ <stdalign.h> および <cstdalign> でそのようなマクロは定義されません。 しかしマクロ定数 __alignas_is_defined はこれらのヘッダで定義されます。
[編集]キーワード
[編集]例
// sse_t 型のすべてのオブジェクトは16バイト境界にアラインされます。struct alignas(16) sse_t {float sse_data[4];}; // 配列「cacheline」は128バイト境界にアラインされます。 alignas(128)char cacheline[128]; int main(){}
[編集]関連項目
alignof 演算子(C++11) | 型のアライメント要件を問い合わせます |
(C++11) | 型のアライメント要件を取得します (クラステンプレート) |
_Alignas の C言語リファレンス |