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

时间:2014-07-22 12:29:18

标签: c++ struct sizeof packing

我试图在 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)会修复它,但它没有。

2 个答案:

答案 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

Compiled on Ideone