alignas
specifier
(since C++11)
型またはオブジェクトの アライメント要件 を指定します。
目次 |
、
、
構文
alignas(
式
)
|
|||||||||
alignas(
型ID
)
|
|||||||||
alignas(
パック
...
)
|
|||||||||
説明
alignas 指定子は以下に適用できます:
- クラスまたは構造体の class の宣言または定義;
- 非ビットフィールドクラスデータメンバの宣言;
-
変数の宣言(ただし以下には適用不可):
- 関数パラメータ;
- catch節の例外パラメータ。
そのような宣言によって宣言されるオブジェクトまたは型は、
アライメント要件
が、宣言で使用されたすべての
alignas
指定子の非ゼロ
expression
の中で最も厳しい(最大の)ものと等しくなります。ただし、型の自然なアライメントを弱める場合は除きます。
宣言における最も厳格な(最大の)
alignas
が、いかなる
alignas
指定子なしで持つべきアラインメント(すなわち、その自然なアラインメントや、同じオブジェクトまたは型の別の宣言における
alignas
よりも弱い場合)、プログラムは不適格となります:
struct alignas(8) S {}; struct alignas(1) U { S s; }; // エラー: alignas(1)がなければUのアライメントは8になっていた
ゼロ以外の無効なアライメント、例えば alignas ( 3 ) は ill-formed です。
同じ宣言内で他の alignas よりも弱い有効な非ゼロのアライメントは無視されます。
alignas ( 0 ) は常に無視されます。
注記
ISO C11規格以降、C言語は _Alignas キーワードを持ち、 alignas をヘッダーファイル <stdalign.h> 内でこのキーワードに展開するプリプロセッサマクロとして定義しています。
C++では、これはキーワードであり、
|
ヘッダー <stdalign.h> および <cstdalign> はそのようなマクロを定義しない。ただし、マクロ定数 __alignas_is_defined は定義する。 |
(C++20まで) |
|
ヘッダー <stdalign.h> はそのようなマクロを定義しない。ただし、マクロ定数 __alignas_is_defined は定義する。 |
(C++20以降) |
キーワード
例
#include <iostream> // struct_float型のすべてのオブジェクトは // alignof(float)境界(通常は4)にアラインされる: struct alignas(float) struct_float { // ここに定義を記述 }; // sse_t型のすべてのオブジェクトは32バイト境界にアラインされる: 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 Carries dependency属性 [dcl.attr.depend]
- C++20 標準 (ISO/IEC 14882:2020):
-
- 9.12.3 Carries dependency 属性 [dcl.attr.depend]
- C++17規格 (ISO/IEC 14882:2017):
-
- 10.6.3 Carries dependency属性 [dcl.attr.depend]
- C++14規格 (ISO/IEC 14882:2014):
-
- 7.6.4 依存関係伝播属性 [dcl.attr.depend]
- C++11規格 (ISO/IEC 14882:2011):
-
- 7.6.4 Carries dependency属性 [dcl.attr.depend]
関連項目
alignof
(C++11)
|
型のアライメント要件を問い合わせる
(演算子) |
|
(C++11)
|
型のアライメント要件を取得する
(クラステンプレート) |
|
Cドキュメント
for
_Alignas, alignas
|
|