2014-07-22 54 views
1

我试图打包一个结构,使用g ++在 64位 32位窗口。C/C++结构打包不起作用

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

如果你能回答它,继续前进。 – chris

+1

@Timmmm如果你使用'#pragma pack(1)'编码。 – Sathish

+0

如果你想让它们更小,可以尝试在结构体中放置最后一个较小的类型。 –

回答

2

终于发现它是a bug in g++

一般的问题是,属性((__packed))仅适用于 结构的最后一个字段。这是9尺寸的原因。特技是 这里'#pragma pack(1)'。通过它你会得到预期的尺寸。问题是 即使对结构体/联合体标记的 进行打包(或通过-fpack-struct选项),也会应用此字段对齐。

那么有似乎是这种解释有些怀疑,但解决方案的工作 - 用#pragma pack(1),而不是像这样:

#pragma pack(1) 

struct Foo 
{ 
    uint8_t a; 
    uint32_t b; 
}; 

#pragma pack() 

第二#pragma复位包价值。

+1

这是一个从MinGW(明显)g ++ 4.7开始的bug。我有正确的大小与g ++ 4.6.2,我刚刚升级到4.8.1,现在我得到错误的大小。 – Holt

+1

查看上游的gcc错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 52991 – benjarobin

0

应该是5包装时,对我的作品上

Linux版本的3.13.0-32泛型(buildd @ kissel)(gcc版本4.8.2 (Ubuntu的4.8.2-19ubuntu1)) #57,Ubuntu的SMP周二7月15日3时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