名前空間
変種
操作

_Alignas (C11以降)(C23で非推奨), alignas (C23以降)

From cppreference.com
< c‎ | language

宣言構文で、宣言されるオブジェクトのアライメント要件を変更する型指定子の一つとして現れます。

目次

[編集] 構文

_Alignas ( ) (1) (C11 以降)
alignas ( ) (2) (C23以降)
_Alignas ( ) (3) (C11 以降)
alignas ( ) (4) (C23以降)
- 有効なアライメントまたはゼロの値を持つ任意の整数定数式
type - 任意の型名

キーワード_Alignasは、ヘッダー<stdalign.h>で利用可能な便利なマクロalignasとしても利用できます。

(C23まで)

[編集] 説明

_Alignas(C23まで)alignas(C23以降)指定子は、ビットフィールドではないオブジェクト、およびregister記憶域クラスを持たないオブジェクトの宣言にのみ使用できます。関数パラメータ宣言やtypedefには使用できません。

宣言で使用される場合、宣言されるオブジェクトのアライメント要件は次のように設定されます。

1,2)ゼロでない限り、の結果
3,4)のアライメント要件、すなわち_Alignof(type)(C23まで)alignof(type)(C23以降)

ただし、これにより型が本来持っていたアライメントが弱められる場合は除きます。

がゼロと評価される場合、この指定子は効果がありません。

同じ宣言に複数の_Alignas(C23まで)alignas(C23以降)指定子が現れる場合、最も厳しいものが使用されます。

_Alignas(C23まで)alignas(C23以降)指定子はオブジェクトの定義にのみ現れる必要がありますが、宣言のいずれかが_Alignas(C23まで)alignas(C23以降)を使用する場合、定義の_Alignas(C23まで)alignas(C23以降)と同じアライメントを指定しなければなりません。異なる翻訳単位が同じオブジェクトに対して異なるアライメントを指定した場合の動作は未定義です。

[編集] 注意

C++では、alignas指定子はクラス/構造体/共用体型および列挙型の宣言にも適用できます。これはCではサポートされていませんが、構造体型のアライメントは、メンバ宣言で_Alignas(C23まで)alignas(C23以降)を使用することで制御できます。

[編集] キーワード

alignas, _Alignas

[編集]

#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)

[編集] 関連項目

他のどのスカラ型よりも大きいアライメント要求を持つ型
(typedef) [編集]
_Alignof(C23まで)alignof(C23以降) オブジェクトのアライメント要件を問い合わせます
(演算子)
C++ドキュメント (alignas指定子)
English 日本語 中文(简体) 中文(繁體)