C++ C/C++;结构打包不工作
我正在尝试在64位32位windows上使用g++打包结构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是四舍五入的?(事实
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;
}