alignas 指定子 (C++11 以降)
From cppreference.com
型またはオブジェクトのアライメント要件を指定します。
目次 |
[編集] 構文
alignas( 式 ) |
|||||||||
alignas( 型ID ) |
|||||||||
alignas( パック ... ) |
|||||||||
2) alignas(alignof( 型ID )) と同等です。
3) 同じ宣言に複数の alignas 指定子が適用されることと同等であり、パラメータパックの各メンバーに対して1つずつ適用されます。パラメータパックは型または非型パラメータパックのいずれかです。
[編集] 説明
alignas 指定子は以下に適用できます。
- クラスの宣言または定義;
- 非ビットフィールドクラスデータメンバーの宣言;
- 変数宣言。ただし、以下には適用できません。
- 関数パラメータ;
- catch句の例外パラメータ。
そのような宣言によって宣言されたオブジェクトまたは型は、型の自然なアライメントを弱めない限り、宣言で使用されているすべての alignas 指定子の最も厳密な(最大の)非ゼロ式に等しいアライメント要件を持ちます。
宣言上の最も厳密な(最大の)alignas が、alignas 指定子なしで持っていたであろうアライメント(つまり、その自然なアライメントよりも弱い、または同じオブジェクトや型の別の宣言上の alignas よりも弱い)よりも弱い場合、プログラムは不正です。
struct alignas(8) S {}; struct alignas(1) U { S s; }; // error: alignment of U would have been 8 without alignas(1)
alignas(3) のような無効な非ゼロアライメントは不正です。
同じ宣言で別のalignasよりも弱い有効な非ゼロアライメントは無視されます。
alignas(0) は常に無視されます。
[編集] 備考
ISO C11 標準以降、C 言語には_Alignasキーワードがあり、ヘッダー<stdalign.h>でキーワードに展開されるプリプロセッサマクロとしてalignasを定義しています。
C++では、これはキーワードであり、
|
ヘッダー<stdalign.h>と<cstdalign>はそのようなマクロを定義しません。ただし、マクロ定数__alignas_is_definedを定義します。 |
(C++20まで) |
|
ヘッダー<stdalign.h>はそのようなマクロを定義しません。ただし、マクロ定数__alignas_is_definedを定義します。 |
(C++20以降) |
[編集] キーワード
[編集] 例
このコードを実行
#include <iostream> // Every object of type struct_float will be aligned // to alignof(float) boundary (usually 4): struct alignas(float) struct_float { // your definition here }; // Every object of type sse_t will be aligned to 32-byte boundary: struct alignas(32) sse_t { float sse_data[4]; }; int main() { struct default_aligned { float data[4]; } a, b, c; sse_t x, y, z; std::cout << "alignof(struct_float) = " << alignof(struct_float) << '\n' << "sizeof(sse_t) = " << sizeof(sse_t) << '\n' << "alignof(sse_t) = " << alignof(sse_t) << '\n' << std::hex << std::showbase << "&a: " << &a << "\n" "&b: " << &b << "\n" "&c: " << &c << "\n" "&x: " << &x << "\n" "&y: " << &y << "\n" "&z: " << &z << '\n'; }
実行結果の例
alignof(struct_float) = 4 sizeof(sse_t) = 32 alignof(sse_t) = 32 &a: 0x7fffcec89930 &b: 0x7fffcec89940 &c: 0x7fffcec89950 &x: 0x7fffcec89960 &y: 0x7fffcec89980 &z: 0x7fffcec899a0
[編集] 欠陥レポート
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| CWG 1437 | C++11 | alignasはエイリアス宣言で使用できる | 禁止された |
| CWG 2354 | C++11 | alignasは列挙型の宣言に適用できる | 禁止された |
[編集] 参照
- C++23標準 (ISO/IEC 14882:2024)
- 9.12.4 依存性属性を持つ [dcl.attr.depend]
- C++20 standard (ISO/IEC 14882:2020)
- 9.12.3 依存性属性を持つ [dcl.attr.depend]
- C++17 standard (ISO/IEC 14882:2017)
- 10.6.3 依存性属性を持つ [dcl.attr.depend]
- C++14 standard (ISO/IEC 14882:2014)
- 7.6.4 依存性属性を持つ [dcl.attr.depend]
- C++11 standard (ISO/IEC 14882:2011)
- 7.6.4 依存性属性を持つ [dcl.attr.depend]
[編集] 関連項目
alignof (C++11) |
型のアライメント要件を問い合わせる (演算子) |
| (C++11) |
型のアライメント要件を取得する (クラステンプレート) |
| C ドキュメント for _Alignas, alignas
| |