Oracle® Solaris Studio 12.4: C ユーザーガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

2.11.19 pack

#pragma pack(n)

#pragma pack(n) を使用すると、構造体または共用体のメンバーの pack に影響を及ぼします。構造体または共用体のメンバーはデフォルトでは、char 型の場合は 1 バイト、short 型の場合は 2 バイト、整数型の場合は 4 バイト、といった具合に、その自然境界で整列されます。n が存在する場合、それは、任意の構造体または共用体メンバーに対するもっとも厳格な自然整列を指定する 2 の累乗でなければいけません。ゼロは受け入れられません。

#pragma pack(n) 指令は、次の pack 指令までのすべての構造体または共用体の定義に適用されます。別の翻訳単位で同じ構造体または共用体に対して異なる #pragma pack の定義が行われている場合、プログラムは予期しない形でコンパイルに失敗することがあります。特に、#pragma pack(n) は、事前にコンパイルされたライブラリのインタフェースを定義するヘッダーをインクルードする前には使用しないでください。#pragma pack(n) は、プログラムコード内の境界整列を変更するすべての構造体または共用体の直前に挿入することをお勧めします。そして、その構造体の直後に #pragma pack( ) を続けてください。

#pragma pack(n) を使用すると、構造体または共用体のメンバーの境界整列を指定できます。たとえば、#pragma pack(2) を指定すると、int、long、long long、float、double、long double およびポインタが、それぞれの自然整列境界ではなく、2 バイト境界に整列されます。

n がプラットフォームでもっとも厳密な整列を指示する値 (-m32 の x86 では 4、—m32 の SPARC では 8、-m64 の SPARC では 32) か、それより大きな値の場合は、自然境界整列が有効になります。n が省略された場合も、メンバーは自然境界整列に戻ります。

#pragma pack を使用する場合、構造体または共用体自身の整列条件は、その構造体または共用体でより厳密に境界整列されるメンバーの整列条件と同一です。したがって、その struct または union の任意の宣言は、pack の境界整列となります。たとえば、char 型だけの struct は整列の制限はありませんが、double 型を含む struct は 8 バイトの境界上に並びます。


注 -  #pragma pack を使用して構造体または共用体のメンバーを自然境界以外の境界で整列させると、通常、これらのフィールドへのアクセスが発生した場合に SPARC 上でバスエラーが起きます。このエラーを回避するには、必ず -xmemalign オプションも指定してください。このようなプログラムをコンパイルする最適な方法については、-xmemalign=ab を参照してください。