gpt4 book ai didi

c++ - MSVC 2008 16 字节结构成员对齐异常

转载 作者:太空狗 更新时间:2023-10-29 20:46:54 24 4
gpt4 key购买 nike

谁能解释一下这是怎么回事?

我的 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 设置,我绝对无法理解...

最佳答案

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

MSDN says ,

When you specify this option, each structure member after the first is stored on either the size of the member type or n-byte boundaries (where n is 1, 2, 4, 8, or 16), whichever is smaller.

请阅读“以较小者为准”。它并没有说该结构将由 16 填充。它定义了每个成员相对于彼此的边界,从第一个成员开始。

你基本上想要的是align (C++)属性,表示

Use __declspec(align(#)) to precisely control the alignment of user-defined data

那么试试这个:

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

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

它应该打印出您所期望的。

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

关于c++ - MSVC 2008 16 字节结构成员对齐异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6844956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com