さまざまなデータ型を含む集合体 (C および C++ の構造体や共用体、C++ のクラスなど) 内部では、XL C/C++ がサポートする各データ型は、次のように、プラットフォーム固有のデフォルトに従って、バイト境界に沿って位置合わせされます。
上記の各設定は、表 6 で定義されています。
データの位置合わせは、位置合わせモード と位置合わせ修飾子 で明示的に制御することもできます。位置合わせモード では、次のようなことができます。
- コンパイル・プロセスで、単一または複数ファイル内のすべての集合体の位置合わせを設定する
- この方法を使用するためには、コンパイル時に、-qalign コンパイラー・オプションを指定します。表 6 に、
-qalign の有効なサブオプションがプラットフォームごとに示されています。
- ファイル内の単一または複数の集合体の位置合わせを設定する
- この方法を使用するには、ソース・ファイルで、#pragma align または #pragma options align ディレクティブを指定します。表 6 に、
#pragma align の有効なサブオプションがプラットフォームごとに示されています。各ディレクティブは、別のディレクティブに遭遇するまで、またはコンパイル単位の終わりまで、そのディレクティブに従うすべての集合体で有効な位置合わせ規則を変更します。
- 単一集合体の位置合わせを設定する
- #pragma align ディレクティブに加えて、ソース・ファイルでは以下を使用できます。
- 構造体宣言に __attribute__((aligned(n))) 型属性を組み込む。n の値は、2 の正の累乗でなければなりません。
__attribute__((aligned)) を集合体の型属性に使用する場合の正しい構文については、「XL C/C++ ランゲージ・リファレンス」の『型属性』を参照してください。
- 構造体宣言に __align(n) 指定子を組み込む。
n の値は 2 の正の累乗です。
位置合わせ修飾子 では、次のようなことができます。
- 集合体内のすべてのメンバーの位置合わせを設定する
- この方法を使用するには、ソース・ファイルで以下のいずれかを使用してください。
- 構造体宣言の前に #pragma pack ディレクティブを組み込む。このディレクティブの有効な値については、「XL C/C++ コンパイラー・リファレンス」の #pragma pack を参照してください。
- 構造体宣言に __attribute__((packed)) 型属性を組み込む。
__attribute__((packed)) を型属性に使用する場合の正しい構文については、「XL C/C++ ランゲージ・リファレンス」の『型属性』を参照してください。
- 集合体内の単一メンバーの位置合わせを設定する
- この方法を使用するには、__attribute__((packed)) または __attribute__((aligned(n))) 型属性または変数属性を、構造体宣言に組み込みます。の n の値は、
2 の正の累乗でなければなりません。変数属性について詳しくは、「XL C/C++ ランゲージ・リファレンス」の『aligned 変数属性』および『packed 変数属性』を参照してください。型属性については、「XL C/C++ ランゲージ・リファレンス」の『型属性』を参照してください。
- 注:
- __align 指定子および __attribute__((aligned)) 属性では、
vector 型の位置合わせは変更されません。
表 6. 位置合わせ設定
データ型
| ストレージ
| 位置合わせ設定とサポートされるプラットフォーム
|
natural
| power
| full
| mac68k
| twobyte
| linuxppc
| bit_packed
| packed
|
---|
AIX
Mac
|
AIX
Mac
| AIX
|
AIX
Mac
| AIX
| Linux
|
AIX
Mac
Linux
| AIX
|
---|
_Bool (C)、bool (C++)、_Bool
| 1 バイト
| 適用外
| 適用外
| 適用外
| 1 バイト
| 1 バイト
| 適用外
|
char、signed char、unsigned char
| 1 バイト
| 1 バイト
| 1 バイト
| 1 バイト
| 1 バイト
| 1 バイト
|
wchar_t (32 ビット・モード)
| 2 バイト
| 2 バイト
| 2 バイト
| 2 バイト
| 2 バイト
| 1 バイト
|
wchar_t (64 ビット・モード)
| 4 バイト
| 4 バイト
| 4 バイト
| サポート対象外2
| 4 バイト
| 1 バイト
|
int、unsigned int
| 4 バイト
| 4 バイト
| 4 バイト
| 2 バイト
| 4 バイト
| 1 バイト
|
short int、unsigned short int
| 2 バイト
| 2 バイト
| 2 バイト
| 2 バイト
| 2 バイト
| 1 バイト
|
long int、unsigned long int (32 ビット・モード)
| 4 バイト
| 4 バイト
| 4 バイト
| 2 バイト
| 4 バイト
| 1 バイト
|
long int、unsigned long int (64 ビット・モード)
| 8 バイト
| 8 バイト
| 8 バイト
| サポート対象外2
| 8 バイト
| 1 バイト
|
long long
| 8 バイト
| 8 バイト
| 8 バイト
| 2 バイト
| 8 バイト
| 1 バイト
|
float
| 4 バイト
| 4 バイト
| 4 バイト
| 2 バイト
| 4 バイト
| 1 バイト
|
double
| 8 バイト
| 8 バイト
| 注を参照 1
| 2 バイト
| 8 バイト
| 1 バイト
|
long double
| 8 バイト
| 8 バイト
| 注を参照 1
| 2 バイト
| 8 バイト
| 1 バイト
|
pointer (32 ビット・モード)
| 4 バイト
| 4 バイト
| 4 バイト
| 2 バイト
| 4 バイト
| 1 バイト
|
pointer (64 ビット・モード)
| 8 バイト
| 8 バイト
| 8 バイト
| サポート対象外2
| 8 バイト
| 1 バイト
|
ベクトル型 3
| 16 バイト
| 16 バイト
| 16 バイト
| 適用外
| 16 バイト
| 適用外
| 16 バイト
| 1 バイト
| 適用外
|
注:
- これらの型は、集合体の最初のメンバーに対しては
natural 位置合わせを使用し、2 番目以降のメンバーに対しては
4 バイトまたは natural 位置合わせ (いずれか値の小さい方) を使用します。
- この型のメンバーで集合体を宣言し、この位置合わせ設定でコンパイルしようとすると、コンパイラーは警告メッセージを出し、該当するプラットフォームのデフォルトの位置合わせ設定を使用してコンパイルを行います。
- -qaltivec コンパイラー・オプションが有効になっている場合に限り、サポートされます。
|
あるプラットフォーム上のアプリケーションでデータを生成し、そのデータを別のプラットフォーム上のアプリケーションで読み取る場合は、プラットフォームに依存しない位置合わせモード (#pragma pack、qalign=bit_packed など) を使用する必要があります。
- 注:
-
C++ コンパイラーは、基本クラスまたは仮想関数を含むクラスに対して、余分なフィールドを生成することがあります。これらの型のオブジェクトは、集合体に対する通常のマッピングに準拠していない可能性があります。
集合体の位置合わせを 表 6 にリストされている設定のいずれかで制御する場合は、以下の規則が適用されます。
- すべての位置合わせ設定で、集合体のサイズ は、その位置合わせ値の倍数のうち、集合体のすべてのメンバーを内包することのできる最小の倍数となる。
- mac68k を除くすべての位置合わせ設定で、集合体の位置合わせ は、そのメンバーの最大の位置合わせ値と等しい。
- 位置合わせされる集合体はネストすることができ、ネストされた個々の集合体に適用できる位置合わせ規則は、ネストされた集合体の宣言時に有効になっている位置合わせモードによって決まる。
ビット・フィールドを含む集合体の位置合わせ規則については、ビット・フィールドの使用と位置合わせを参照してください。
