Namespaces
Variants

_Alignas (since C11) (deprecated in C23) , alignas (since C23)

From cppreference.net

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

目次

翻訳のポイント: - 「Contents」を「目次」に翻訳 - HTMLタグ、属性、 内のC++関連用語(Syntax, Explanation, Notes, Keywords, Example, Defect reports, References, See also)は翻訳せず保持 - 数値、リンク、クラス名などはすべて元のまま維持 - プロフェッショナルな技術文書としての正確性を確保

構文

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

キーワード _Alignas は利便性マクロ alignas としても利用可能であり、ヘッダー <stdalign.h> で提供されます。

(C23まで)

説明

_Alignas (C23まで) alignas (C23以降) 指定子は、 ビットフィールド ではないオブジェクトの宣言時のみ使用でき、 register ストレージクラスを持つことはできません。関数パラメータ宣言では使用できず、typedefでも使用できません。

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

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

自然に持っていたはずの型のアライメントを弱める場合を除く。

expression がゼロと評価された場合、この指定子は効果を持ちません。

複数の _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 (until C23) alignof (since C23) オブジェクトのアライメント要件を問い合わせる
(operator)
C++ documentation for alignas 指定子