C/C++ 结构打包不起作用

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)会解决它,但它没有。

Tim*_*mmm 5

最后发现它是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重置包值。