【发布时间】:2009-09-21 16:29:22
【问题描述】:
我有一个预定义的结构(实际上是几个),其中变量跨越 32 位字边界。在 Linux(和使用 GCC 的 Windows)中,我可以使用“属性((打包))”将我的结构打包到正确的大小。但是,我无法使用 VC++ 和#pragma pack 使其以相同的方式工作。
使用 GCC 会返回正确的 6 字节大小:
struct
{
unsigned int a : 3;
unsigned int b : 1;
unsigned int c : 15;
unsigned int troubleMaker : 16;
unsigned short padding : 13;
} __attribute__((packed)) s;
使用 VC++ 会返回错误的 8 字节大小
#pragma pack(push)
#pragma pack(1)
struct
{
unsigned int a : 3;
unsigned int b : 1;
unsigned int c : 15;
unsigned int troubleMaker : 16;
unsigned short padding : 13;
} s;
#pragma pack(pop)
我可以通过手动将 'troubleMaker' 跨边界拆分来让事情正常工作,但我不希望这样做。有什么想法吗?
【问题讨论】:
-
它们不仅跨越 32 位边界,还跨越单字节边界。要获得 6 的大小,变量必须从一个字节的中间开始。我很惊讶 GCC 允许这样做。在任何情况下,如果我是你,我会删除位域,只让结构包含 6 个字符(或 3 个短裤,或其他)的数组,然后编写访问器函数来屏蔽所需的位。
标签: c++ memory gcc visual-c++