有人可以解释一下发生了什么吗?
我的 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 设置,我绝对无法理解它......
答案 0 :(得分:4)
我认为您误解了/Zp16
选项。
指定此选项时,第一个结构后面的每个结构成员都是 存储在成员类型或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()