#pragma pack([n]) |
pack は、構造体メンバーの配置制御に使用します。
n を指定する場合は、0 または 2 の累乗にする必要があります。0 以外の値を指定すると、コンパイラは n バイトの境界整列と、データ型に対するプラットフォームの自然境界のどちらか小さい方を使用します。たとえば次の指令は、自然境界整列が 4 バイトまたは 8 バイト境界である場合でも、指令のあと (および後続の pack 指令の前) に定義されているすべての構造体のメンバーを 2 バイト境界を超えないように揃えます。
#pragma pack(2) |
n が 0 であるか省略された場合、メンバー整列は自然境界整列の値に戻ります。
n の値がプラットフォームのもっとも厳密な境界整列と同じかそれ以上の場合には、自然境界整列になります。次の表に、各プラットフォームのもっとも厳密な境界整列を示します。
表 B–1 プラットフォームのもっとも厳密な境界整列
プラットフォーム |
もっとも厳密な境界整列 |
---|---|
x86 |
4 |
SPARC 一般、V8、V8a、V8plus、V8plusa、V8plusb |
8 |
SPARC V9、V9a、V9b |
16 |
pack 指令は、次の pack 指令までに存在するすべての構造体定義に適用されます。別々の翻訳単位にある同じ構造体に対して異なる境界整列が指定されると、プログラムは予測できない状態で異常終了する場合があります。特に、コンパイル済みライブラリのインタフェースを定義するヘッダーをインクルードする場合は、その前に pack を使用しないでください。プログラムコード内では、pack 指令は境界整列を指定する構造体の直前に置き、#pragma pack() は構造体の直後に置くことをお勧めします。
SPARC プラットフォーム上で #pragma pack を使用して、型のデフォルトの境界整列よりも密に配置するには、アプリケーションのコンパイルとリンクの両方で -misalign オプションを指定する必要があります。次の表に、整数データ型のメモリーサイズとデフォルトの境界整列を示します。
表 B–2 メモリーサイズとデフォルトの境界整列 (単位はバイト数)
型 |
SPARC V8 サイズ、境界整列 |
SPARC V9 サイズ、境界整列 |
x86 サイズ、境界整列 |
---|---|---|---|
bool |
1, 1 |
1, 1 |
1, 1 |
char |
1, 1 |
1, 1 |
1, 1 |
short |
2, 2 |
2, 2 |
2, 2 |
wchar_t |
4, 4 |
4, 4 |
4, 4 |
int |
4, 4 |
4, 4 |
4, 4 |
long |
4, 4 |
8, 8 |
4, 4 |
float |
4, 4 |
4, 4 |
4, 4 |
double |
8, 8 |
8, 8 |
8, 4 |
long double |
16, 8 |
16, 16 |
12, 4 |
データへのポインタ |
4, 4 |
8, 8 |
4, 4 |
関数へのポインタ |
4, 4 |
8, 8 |
4, 4 |
メンバーデータへのポインタ |
4, 4 |
8, 8 |
4, 4 |
メンバー関数へのポインタ |
8, 4 |
16, 8 |
8, 4 |