/Zp フラグを指定せずに、VS2012 の x64 プロジェクトで次のコードをコンパイルすると、次のようになります。
#pragma pack(show)
次に、コンパイラは吐き出します:
value of pragma pack(show) == 16
プロジェクトが Win32 を使用している場合、コンパイラは次のように出力します。
value of pragma pack(show) == 8
私が理解していないのは、Win64 の任意の型 (つまり、long long とポインター) の最大の自然なアラインメントが 8 であるということです。
それに関連して、なぜ /Zp16 を使用するのでしょうか?
編集:
これが私が話していることを示す例です。x64 の場合、ポインターは 8 バイトの自然なアライメントを持っていますが、Zp1 はポインターを強制的に 1 バイト境界にすることができます。
struct A
{
char a;
char* b;
}
// Zp16
// Offset of a == 0
// Offset of b == 8
// Zp1
// Offset of a == 0
// Offset of b == 1
ここで、SSE を使用する例を挙げると:
struct A
{
char a;
char* b;
__m128 c; // uses declspec(align(16)) in xmmintrinsic.h
}
// Zp16
// Offset of a == 0
// Offset of b == 8
// Offset of c == 16
// Zp1
// Offset of a == 0
// Offset of b == 1
// Offset of c == 16
__m128 が本当に組み込み型である場合、オフセットは Zp1 で 9 になると予想されます。しかし、xmmintrinsic.h の定義で __declspec(align(16)) を使用しているため、Zp 設定より優先されます。
だからここに私の質問が少し異なって表現されています: 16B の自然な位置合わせを持つが、前の例で 9 のオフセットを持つ 'c' の型はありますか?