Tim*_*mmm 4 c++ struct sizeof packing
我正在尝试打包一个结构,在64 位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;
}
Run Code Online (Sandbox Code Playgroud)
这输出 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.
Run Code Online (Sandbox Code Playgroud)
所以看起来结构体是打包的,但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()
Run Code Online (Sandbox Code Playgroud)
第二个#pragma重置包值。
| 归档时间: |
|
| 查看次数: |
2389 次 |
| 最近记录: |