# pragma pack ([n])
pack は、構造体メンバーの配置制御に使用します。
n を指定する場合、0 であるか 2 の累乗でなければなりません。0 以外の値を指定すると、コンパイラは n バイトの境界整列と、データ型に対するプラットフォームの自然境界のどちらか小さい方を使用します。たとえば次の指令は、自然境界整列が 4 バイトまたは 8 バイト境界である場合でも、指令の後 (および後続の pack 指令の前) に定義されているすべての構造体のメンバーを 2 バイト境界を超えないように揃えます。
#pragma weak pack(2)
n が 0 であるか省略された場合、メンバー整列は自然境界整列の値に戻ります。
n の値がプラットフォームの最も厳密な境界整列と同じかそれ以上の場合には、自然境界整列になります。
表 3-1 プラットフォームの最も厳密な境界整列
プラットフォーム |
最も厳密な境界整列 |
---|---|
x86 |
4 |
SPARC 一般、v7、v8、v8a、v8plus、v8plusa |
8 |
SPARC v9、v9a |
16 |
pack 指令は、次の pack 指令までに存在するすべての構造体定義に適用されます。別々の翻訳単位にある同じ構造体に対して異なる境界整列が指定されると、プログラムは予測できない状態で異常終了する場合があります。特に、コンパイル済みライブラリのインタフェースを定義するヘッダーをインクルードする場合は、その前に pack を使用しないでください。プログラムコード内では、pack 指令は境界整列を指定する構造体の直前に置き、#pragma pack( ) は構造体の直後に置くことをお勧めします。