pack
構造体共用体クラス メンバーにパッキング配置を指定します。
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
解説
pack はデータ宣言のレベルに制御できます。これはコントロールだけを使用するコンパイラ オプション /Zp とは異なります。pack は最初の struct でunion 適用するかプラグマの後ろの class の宣言が表示されます。pack は定義には影響しません。引数を指定せずにを呼び出します pack コンパイラ オプション /Zp の値が設定されて n を設定します。コンパイラ オプションが設定されていない場合既定値は 8. です。
構造体の配置を変更するとメモリにだけ多くの領域を使用してパフォーマンスの低下を表示したり整列にアクセスするためのハードウェア生成された例外を受け取ることができます。SetErrorMode を使用してこの例外の動作を変更できます。
show(省略可能)
パッキングの配置の現在のバイト値を表示します。値は警告メッセージが表示されます。push(省略可能)
コンパイラの内部スタック内の現在のパッキング配置の値を押してn に現在のパッキング配置の値を設定します。n が指定されていない場合現在のパッキング配置の値が押されています。pop(省略可能)
コンパイラの内部スタックの最上位からレコードを削除します。n が pop を指定しない場合スタック上のレコードに関連付けられているパッキング値が新しいパッキング配置の値です。n は#pragma pack(pop, 16) 指定するとn は新しいパッキング配置の値になります。identifier とたとえば#pragma pack(pop, r1) 操作で複数鳴ればスタックのすべてのレコードが identifier がそのレコードがポップされます。レコードがポップされパッキング値はTop 結果のレコードに関連付けられているスタック新しいパッキング配置の値です。スタックの各レコードには identifier と操作で複数鳴ればpop は無視されます。identifier(省略可能)
プロジェクトの名前コンパイラの内部スタックのレコードに push に使用された場合。pop を使用するとpop は内部スタックから identifier が削除されるまで記録します ; identifier が内部スタックにいない場合は何も操作では鳴りません。n (省略可能)
バイト単位で値をパッキングに使用するを指定します。コンパイラ オプション /Zp がモジュールに設定されていない場合n の既定値は 8. です。有効な値は1248および 16 です。メンバーの配置は n の倍数またはメンバーのサイズの倍数の境界に小さいどの場合でもあります。
#pragma pack(pop,identifier,n) は未定義です。
配置を変更する方法の詳細については以下のトピックを参照してください :
構造体の配置例 (x64 固有)
使用例
次の例は構造体の配置を変更するには 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("%d ", offsetof(S, i));
printf("%d ", offsetof(S, j));
printf("%d\n", offsetof(S, k));
printf("%d ", offsetof(T, i));
printf("%d ", offsetof(T, j));
printf("%d\n", offsetof(T, k));
}
0 4 8
0 4 6
次の例では pushpop と 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