__alignof__ 演算子 (IBM 拡張)

__alignof__ 演算子は、その演算子のオペランドの位置合わせ先の位置を戻す、C99 および C++03 の言語拡張機能です。オペランドは式であってもよいし、括弧で囲んだ型 ID であってもかまいません。 オペランドが左辺値を表す式である場合、__alignof__ によっ て戻される数値は、その左辺値が持つことが判明している位置合わせを表します。 式の型はコンパイル時に判別されますが、式そのものは評価されません。 オペランドが型である場合、その数値は、ターゲット・プラットフォーム上でそ の型に対して通常必要な位置合わせを表します。

__alignof__ 演算子は、次の状況に適用することはできません。
  • ビット・フィールドを表す左辺値
  • 関数型
  • 未定義の構造体またはクラス
  • 不完全型 (void など)
構文図を読む構文図をスキップする
__alignof__ 演算子の構文 

>>-__alignof__--+-unary_expression-+---------------------------><
                '-(--type-id--)----'   

type-id が参照、または参照された型である場合、結果 は、参照された型の位置合わせです。 type-id が配列である場合、結果は、配列エレメント型 の位置合わせです。 type-id が基本型である場合、結果は、インプリメンテ ーションで定義されたとおりです。

例えば、AIX® では、__alignof__(wchar_t) は、32 ビット・ターゲットに対して 2 を戻し、64 ビット・ターゲットに対して 4 を戻します。

ベクトルのサポートが使用可能になっている場合には、__alignof__ のオペランドをベクトル型にすることができます。次に例を示します。
vector unsigned int v1 = (vector unsigned int)(10);
vector unsigned int *pv1 = &v1;
__alignof__(v1); // vector type alignment: 16.
__alignof__(&v1); // address of vector alignment: 4.
__alignof__(*pv1); // dereferenced pointer to vector alignment: 16.
__alignof__(pv1); // pointer to vector alignment: 4.
__alignof__(vector signed char); // vector type alignment: 16.
__attribute__((aligned)) を使用して、ベクトル型の変数の位置合わせ値を増加させた場合は、__alignof__ 演算子から戻される値は、__attribute__((aligned)) に指定されている位置合わせ計数です。