_Alignas (since C11) (deprecated in C23) , alignas (since C23)
オブジェクトの 宣言 構文において、宣言されるオブジェクトの アライメント要件 を修飾する型指定子の一つとして現れます。
目次 |
構文
_Alignas
(
式
)
|
(1) | (C11以降) | |||||||
alignas
(
式
)
|
(2) | (C23以降) | |||||||
_Alignas
(
型
)
|
(3) | (C11以降) | |||||||
alignas
(
型
)
|
(4) | (C23以降) | |||||||
| expression | - | 値が有効な 整数定数式 またはゼロである任意の アライメント |
| type | - | 任意の 型名 |
|
キーワード
|
(C23まで) |
説明
_Alignas
(C23まで)
alignas
(C23以降)
指定子は、
ビットフィールド
ではないオブジェクトの宣言時のみ使用でき、
register
ストレージクラスを持つことはできません。関数パラメータ宣言では使用できず、typedefでも使用できません。
宣言で使用された場合、宣言されたオブジェクトは アライメント要件 が次のように設定されます
自然に持っていたはずの型のアライメントを弱める場合を除く。
expression がゼロと評価された場合、この指定子は効果を持ちません。
複数の
_Alignas
(C23まで)
alignas
(C23以降)
指定子が同じ宣言内に現れる場合、最も厳格なものが使用されます。
_Alignas
(C23まで)
alignas
(C23以降)
指定子はオブジェクトの
定義
にのみ現れる必要がありますが、いずれかの宣言で
_Alignas
(C23まで)
alignas
(C23以降)
を使用する場合、定義の
_Alignas
(C23まで)
alignas
(C23以降)
と同じアラインメントを指定しなければなりません。同じオブジェクトに対して異なる翻訳単位が異なるアラインメントを指定した場合、動作は未定義です。
注記
C++では、
alignas
指定子はクラス/構造体/共用体型および列挙型の宣言にも適用できます。これはCではサポートされていませんが、構造体型のアラインメントはメンバー宣言で
_Alignas
(C23まで)
alignas
(C23以降)
を使用して制御できます。
キーワード
例
#include <stdalign.h> #include <stdio.h> // every object of type struct sse_t will be aligned to 16-byte boundary // (note: needs support for DR 444) struct sse_t { alignas(16) float sse_data[4]; }; // every object of type struct data will be aligned to 128-byte boundary struct data { char x; alignas(128) char cacheline[128]; // over-aligned array of char, // not array of over-aligned chars }; int main(void) { printf("sizeof(data) = %zu (1 byte + 127 bytes padding + 128-byte array)\n", sizeof(struct data)); printf("alignment of sse_t is %zu\n", alignof(struct sse_t)); alignas(2048) struct data d; // this instance of data is aligned even stricter (void)d; // suppresses "maybe unused" warning }
出力:
sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array) alignment of sse_t is 16
不具合報告
以下の動作変更に関する欠陥報告書は、以前に公開されたC規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| DR 444 | C11 |
_Alignas
は構造体および共用体のメンバーでは許可されていなかった
|
許可される |
参考文献
- C23規格 (ISO/IEC 9899:2024):
-
- 6.7.5 アライメント指定子 (p: TBD)
-
- 6.2.8 オブジェクトのアライメント (p: TBD)
-
- 7.15 アライメント <stdalign.h> (p: TBD)
- C17規格 (ISO/IEC 9899:2018):
-
- 6.7.5 アライメント指定子 (p: 92)
-
- 6.2.8 オブジェクトのアライメント (p: 36-37)
-
- 7.15 アライメント <stdalign.h> (p: 196)
- C11規格 (ISO/IEC 9899:2011):
-
- 6.7.5 アライメント指定子 (p: 127-128)
-
- 6.2.8 オブジェクトのアライメント (p: 48-49)
-
- 7.15 アライメント <stdalign.h> (p: 268)
関連項目
|
(C11)
|
他の任意のスカラ型と同等以上のアライメント要件を持つ型
(typedef) |
| _Alignof (until C23) alignof (since C23) |
オブジェクトのアライメント要件を問い合わせる
(operator) |
|
C++ documentation
for
alignas
指定子
|
|