名前空間
変種
操作

alignas

提供: cppreference.com
< c‎ | language

宣言中のオブジェクトのアライメント要件を変更するために型指定子のひとつとして宣言の構文で使用されます。

目次

[編集] 構文

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

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

[編集] 説明

alignas 指定子は、ビットフィールドでなく register 記憶域クラスを持たないオブジェクトを宣言するときにのみ使用できます。 関数の引数宣言で使用することはできません。 typedef で使用することはできません。

宣言で使用されたとき、その宣言されたオブジェクトは以下のアライメント要件を持ちます。

1) expression の結果 (ゼロでない場合)。
2) type のアライメント要件、すなわち alignof(type)

ただし、その型が自然に持つアライメント要件を弱めることはできません。

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

同じ宣言に複数の alignas 指定子が現れた場合は、もっとも厳しいものが使用されます。

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

[編集] ノート

最初に発行された C11 では、構造体および共用体のメンバで alignas 指定子を使用することはできませんでした。 これは DR 444 で訂正されました。

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

[編集] キーワード

_Alignas

[編集]

#include <stdalign.h>
#include <stdio.h>
// 型 struct sse_t のすべてのオブジェクトは16バイト境界にアラインされます。
// (注: DR 444 のサポートが必要です)
struct sse_t
{
  alignas(16) float sse_data[4];
};
 
// 型 struct data のすべてのオブジェクトは128バイト境界にアラインされます。
struct data {
  char x;
  alignas(128) char cacheline[128]; // char のオーバーアラインされた配列。
                                    // 「オーバーアラインされた char」の配列ではありません。
};
 
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; // data のこのインスタンスはより厳しくアラインされます。
}

出力:

sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array)
alignment of sse_t is 16

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 6.7.5 Alignment specifier
  • 6.2.8 Alignment of objects (p: 48-49)
  • 7.15 Alignment <stdalign.h> (p: 268)

[編集] 関連項目

alignas 指定子C++リファレンス