我试图在 64位 32位窗口上使用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)
会修复它,但它没有。
答案 0 :(得分:4)
最后发现它是a bug in g++。
一般问题是属性((__ packed))仅适用 到结构的最后一个领域。这是9的大小的原因。特里克是 这里&#39; #pragma pack(1)&#39;。通过它你得到预期的尺寸。问题是 这个字段对齐甚至适用于标记的struct / union 要打包(或通过-fpack-struct选项)。
好吧似乎对这个解释存在疑问,但解决方案有效 - 使用#pragma pack(1)
代替:
#pragma pack(1)
struct Foo
{
uint8_t a;
uint32_t b;
};
#pragma pack()
第二个#pragma
重置包值。
答案 1 :(得分:0)
打包时应为5,适合我
Linux版本3.13.0-32-generic(buildd @ kissel)(gcc版本4.8.2 (Ubuntu 4.8.2-19ubuntu1))#57-Ubuntu SMP Tue Tue Jul 15 03:51:08 UTC 2014
和
#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;
}
成功 评论(0) 标准输入 复制
标准输入为空
标准输出 复制
的sizeof(富):5