C++ C/C++;结构打包不工作

C++ C/C++;结构打包不工作,c++,struct,sizeof,packing,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; } 因此,结构似乎是打包的,但在某些情况下,sizeof是四舍五入的?(事实

我正在尝试在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;
}
因此,结构似乎是打包的,但在某些情况下,
sizeof
是四舍五入的?(事实上,写完这个问题后,我想我可以回答,但我还是会为子孙后代发帖的。)

编辑:其实我不知道。我原以为对齐(1)可以修复它,但它没有。

最终找到了它

一般问题是属性((u-packed))仅适用于 到结构的最后一个字段。这就是9码的原因。诀窍是 这里是“#pragma pack(1)”。通过它,您可以得到预期的尺寸。问题是 即使对于已标记的结构/联合,也要应用此字段对齐 要打包(或通过-fpack struct选项)

这一解释似乎有些疑问,但解决方案是可行的——使用
#pragma pack(1)
,如下所示:

#pragma pack(1)

struct Foo
{
    uint8_t a;
    uint32_t b;
};

#pragma pack()

第二个
#pragma
重置包装值。

包装时应为5,在

Linux版本3.13.0-32-generic(buildd@kissel)(gcc版本4.8.2 (Ubuntu 4.8.2-19ubuntu1)#57 Ubuntu SMP周二7月15日03:51:08 UTC 2014

#包括
使用名称空间std;
结构Foo
{
无符号字符a;
无符号整数b;
}_uuu属性_uuu((压缩));
int main(int argc,char*argv[])
{

如果您能回答,请继续。@timmm如果您是用c编写代码,请使用
#pragma pack(1)
。如果您想要较小的类型,请尝试将较小的类型放在结构的最后。无论是在c还是在c++中,都无法用gcc或clang复制:您在32位windows上使用的是MinGW-W64?这显然是一个错误,因为我在g++4.6.2中有正确的尺寸,我刚刚升级到4.8.1,现在我得到了错误的尺寸。
#pragma pack(1)

struct Foo
{
    uint8_t a;
    uint32_t b;
};

#pragma pack()
#include <iostream>
using namespace std;

struct Foo
{
unsigned char a;
unsigned int b;
} __attribute__((packed));


int main(int argc, char *argv[])
{
cout << "sizeof(Foo):" << sizeof(Foo);
return 0;
}