次の方法で共有


pack

構造体メンバー、共用体メンバー、およびクラス メンバーのパッキング アラインメントを指定します。

#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )

解説

pack では、データ宣言レベルで制御できます。 これは、モジュール レベルの制御のみを提供するコンパイラ オプション /Zp とは異なります。 pack は、プラグマが参照された後の最初の struct、union、または class 宣言で有効になります。 pack は、定義への影響はありません。 引数なしの pack を呼び出すと、n が /Zp コンパイラ オプションに設定された値に設定されます。 コンパイラ オプションを設定しない場合、既定値は 8 になります。

構造体の配置を変更すると、メモリの領域はそれほど使用されていなくても、パフォーマンスが低下したり、アラインメントされていないアクセスについてハードウェアで生成された例外を受け取る場合があります。 この例外動作は、SetErrorMode を使用して変更できます。

  • show(省略可能)
    パッキング アラインメントの現在のバイト値を表示します。 値は警告メッセージによって表示されます。

  • push(省略可能)
    現在のパッキング アラインメント値を内部コンパイラ スタックにプッシュし、現在のパッキング アラインメント値を n に設定します。 n が指定されていない場合、現在のパッキング アラインメントの値がプッシュされます。

  • pop(省略可能)
    内部コンパイラ スタックの最上部からレコードを削除します。 n が pop で指定されていない場合、スタックの最上位の結果のレコードに関連付けられているパッキング値は、新しいパッキング アラインメント値になります。 n が指定されている場合、たとえば #pragma pack(pop, 16) では、n が新しいパッキング アラインメント値になります。 identifier (たとえば #pragma pack(pop, r1)) でポップすると、スタック内のすべてのレコードが identifier のあるレコードまでポップされます。 このレコードがポップされ、スタックの最上位の結果のレコードに関連付けられているパッキング値が新しいパッキング アラインメント値になります。 スタック内のどのレコードにもない identifier でポップすると、pop は無視されます。

  • identifier(省略可能)
    push と共に使用した場合、内部コンパイラ スタックのレコードに名前を割り当てます。 pop と共に使用した場合、identifier が削除されるまでレコードを内部スタックからポップします。identifier が内部スタックにない場合は何もポップされません。

  • n (省略可能)
    パッキングに使用される値 (バイト単位) を指定します。 コンパイラ オプション /Zp がモジュールに設定されていない場合、n の既定値は 8 になります。 有効値は 1、2、4、8、および 16 です。 メンバーのアラインメントは、n の倍数またはメンバーのサイズの倍数の小さい方の境界上にあります。

#pragma pack(pop, identifier, n) が未定義です。

アラインメントの変更方法の詳細については、次のトピックを参照してください。

使用例

次のサンプルでは、pack プラグマを使用して、構造体のアラインメントを変更する方法を示します。

// pragma_directives_pack.cpp
#include <stddef.h>
#include <stdio.h>

struct S {
   int i;   // size 4
   short j;   // size 2
   double k;   // size 8
};

#pragma pack(2)
struct T {
   int i;
   short j;
   double k;
};

int main() {
   printf("%Iu ", offsetof(S, i));
   printf("%Iu ", offsetof(S, j));
   printf("%Iu\n", offsetof(S, k));

   printf("%Iu ", offsetof(T, i));
   printf("%Iu ", offsetof(T, j));
   printf("%Iu\n", offsetof(T, k));
}

0 4 8
0 4 6

次の例は、push 構文、pop 構文、および show 構文の使用方法を示しています。

// pragma_directives_pack_2.cpp
// compile with: /W1 /c
#pragma pack()   // n defaults to 8; equivalent to /Zp8
#pragma pack(show)   // C4810
#pragma pack(4)   // n = 4
#pragma pack(show)   // C4810
#pragma pack(push, r1, 16)   // n = 16, pushed to stack
#pragma pack(show)   // C4810
#pragma pack(pop, r1, 2)   // n = 2 , stack popped
#pragma pack(show)   // C4810

参照

関連項目

プラグマ ディレクティブと __Pragma キーワード