位置合わせモードおよび修飾子の使用

さまざまなデータ型を含む集合体 (C および C++ の構造体や共用体、C++ のクラスなど) 内部では、XL C/C++ がサポートする各データ型は、次のように、プラットフォーム固有のデフォルトに従って、バイト境界に沿って位置合わせされます。

上記の各設定は、表 6 で定義されています。

データの位置合わせは、位置合わせモード と位置合わせ修飾子 で明示的に制御することもできます。位置合わせモード では、次のようなことができます。

コンパイル・プロセスで、単一または複数ファイル内のすべての集合体の位置合わせを設定する
この方法を使用するためには、コンパイル時に、-qalign コンパイラー・オプションを指定します。表 6 に、 -qalign の有効なサブオプションがプラットフォームごとに示されています。

ファイル内の単一または複数の集合体の位置合わせを設定する
この方法を使用するには、ソース・ファイルで、#pragma align または #pragma options align ディレクティブを指定します。表 6 に、 #pragma align の有効なサブオプションがプラットフォームごとに示されています。各ディレクティブは、別のディレクティブに遭遇するまで、またはコンパイル単位の終わりまで、そのディレクティブに従うすべての集合体で有効な位置合わせ規則を変更します。

単一集合体の位置合わせを設定する
#pragma align ディレクティブに加えて、ソース・ファイルでは以下を使用できます。

位置合わせ修飾子 では、次のようなことができます。

集合体内のすべてのメンバーの位置合わせを設定する
この方法を使用するには、ソース・ファイルで以下のいずれかを使用してください。

集合体内の単一メンバーの位置合わせを設定する
この方法を使用するには、__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 バイト 適用外

注:

  1. これらの型は、集合体の最初のメンバーに対しては natural 位置合わせを使用し、2 番目以降のメンバーに対しては 4 バイトまたは natural 位置合わせ (いずれか値の小さい方) を使用します。

  2. この型のメンバーで集合体を宣言し、この位置合わせ設定でコンパイルしようとすると、コンパイラーは警告メッセージを出し、該当するプラットフォームのデフォルトの位置合わせ設定を使用してコンパイルを行います。

  3. -qaltivec コンパイラー・オプションが有効になっている場合に限り、サポートされます。

あるプラットフォーム上のアプリケーションでデータを生成し、そのデータを別のプラットフォーム上のアプリケーションで読み取る場合は、プラットフォームに依存しない位置合わせモード (#pragma packqalign=bit_packed など) を使用する必要があります。

注:
C++ C++ コンパイラーは、基本クラスまたは仮想関数を含むクラスに対して、余分なフィールドを生成することがあります。これらの型のオブジェクトは、集合体に対する通常のマッピングに準拠していない可能性があります。

位置合わせの一般的規則

集合体の位置合わせを 表 6 にリストされている設定のいずれかで制御する場合は、以下の規則が適用されます。

ビット・フィールドを含む集合体の位置合わせ規則については、ビット・フィールドの使用と位置合わせを参照してください。 IBM Copyright 2003