如果在VS2012中的x64项目中编译以下代码而没有任何/Zp标志:

#pragma pack(show)

然后编译器将吐出:
value of pragma pack(show) == 16

如果项目使用Win32,则编译器将吐出:
value of pragma pack(show) == 8

我不明白的是,Win64中任何类型(即long long和指针)的最大自然对齐方式是8。那么为什么不对x64设置默认对齐方式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设置。

所以这是我的问题,措词略有不同:是否存在类型为'c'的类型,其自然对齐方式为16B但在上一个示例中的偏移量为9?

最佳答案

MSDN page here包含以下有关您的问题的相关信息:“为什么不为x64设置默认对齐方式8?”:

10-08 19:52