MSVC 2008 16字节结构成员对齐怪异

时间:2011-07-27 13:17:37

标签: c++ visual-c++ gcc alignment

有人可以解释一下发生了什么吗?

我的 MSVC 2008 项目的结构成员对齐设置设置为 16字节(/ Zp16)对齐,但是以下结构之一是通过 16个字节对齐,另一个只通过 8个字节对齐 ... 为什么?!!!

struct HashData
{
    void *pData;
    const char* pName;
    int crc;
    bool bModified;
}; // sizeof (HashData) == 4 + 4 + 4 + 1 + padding = 16 bytes, ok

class StringHash
{
    HashData data[1024];
    int mask;
    int size;
}; // sizeof(StringHash) == 1024 * 16 + 4 + 4 + 0 = 16392 bytes, why not 16400 bytes?

这可能看起来不是什么大问题,但这对我来说是一个大问题,因为我被迫在 GCC 中模仿 MSVC 结构对齐并指定< strong> aligned(16)属性使 sizeof(StringHash)== 16400

请告诉我,何时以及为什么 MSVC 会覆盖 / Zp16 设置,我绝对无法理解它......

2 个答案:

答案 0 :(得分:4)

我认为您误解了/Zp16选项。

MSDN says

  

指定此选项时,第一个结构后面的每个结构成员都是   存储在成员类型或n字节边界的大小上   (其中n为1,2,4,8或16),以较小者为准。

请阅读“较小者”。它没有说结构将被16填充。它更确切地定义了每个成员相对于彼此的边界,从第一个成员开始。

您基本上想要的是align (C++)属性,即

  

使用__declspec(align(#))精确控制用户定义数据的对齐

所以试试这个:

_declspec(align(16)) struct StringHash
{
    HashData data[1024];
    int mask;
    int size;
}; 

std::cout << sizeof(StringHash) << std::endl;

它应该打印出您期望的内容。

或者您可以使用#pragma pack(16)

答案 1 :(得分:1)

考虑使用pack pragma指令:

// Set packing to 16 byte alignment
#pragma pack(16)

struct HashData
{
    void *pData;
    const char* pName;
    int crc;
    bool bModified;
};

class StringHash
{
    HashData data[1024];
    int mask;
    int size;
};

// Restore default packing
#pragma pack()

请参阅:packWorking with Packing Structures