我正在尝试在 64-bit 32 位 Windows 上使用 g++ 来打包一个结构。
struct Foo
{
uint8_t a;
uint32_t b;
} __attribute__((packed));
int main(int argc, char *argv[])
{
qDebug() << "sizeof(Foo):" << sizeof(Foo);
return 0;
}
这输出 8。我尝试过的其他事情:
{ uint8_t a; } // Gives 1, correct.
{ uint8_t a; float b; } // Gives 8, expected 5.
{ uint8_t a; uint16_t b; } // Gives 4, expected 3.
{ uint16_t a; uint8_t b; uint8_t c; } // Gives 4, correct.
所以看起来结构已经被打包了,但是sizeof
在某些情况下会四舍五入吗? (实际上,在写完这个问题后,我想我可以回答它,但无论如何我都会将其发布给后代。)
编辑:其实我不知道。我想aligned(1)
会修复它,但它没有。
终于发现是g++ 中的一个错误.
普遍的问题是属性((__packed)) 仅适用
到结构体的最后一个字段。这就是 9 大小的原因。技巧是
这里是“#pragma pack(1)”。通过它你可以获得预期的尺寸。问题是
即使对于结构/联合的标记,也会应用此字段对齐
要打包(或通过 -fpack-struct 选项)。
好吧,这个解释似乎有些疑问,但解决方案有效 - 使用#pragma pack(1)
而是像这样:
#pragma pack(1)
struct Foo
{
uint8_t a;
uint32_t b;
};
#pragma pack()
第二#pragma
重置包值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)