C ++ Bitfield Struct大小定义(为什么包装更大?)

时间:2014-07-08 18:44:41

标签: c++ struct unions bit-fields

我对C ++中的位打包有疑问。

让我们说我们有一个用C ++定义的结构。它在下面:

typedef struct
{
    unsigned long byte_half : 4;             //0.5
    unsigned long byte_oneAndHalf : 12;      //2
    union
    {
        unsigned long byte_union_one_1 : 8;  //3
        unsigned long byte_union_one_2 : 8;  //3
        unsigned long byte_union_one_3 : 8;  //3
    };
    unsigned long byte_one        : 8;       //4
}LongStruct;

这是一个名为LongStruct的结构。从它的外观来看,它占用4个字节,并适合长。现在我执行以下行:

int size = sizeof(LongStruct);

我看一下尺寸,期望它的值为4.结果我得到了12。我以什么方式错误地可视化我的结构?

提前感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:3)

匿名联合不是替换它的属性,而是在你的位字段结构中间取一个四字节的块。所以你的前两个成员是两个字节+两个填充。然后你的联合是一个字节加三个填充。然后你的最后一个成员是一个字节和三个填充。总数是你观察到的12个。

我将尝试深入了解标准,以确切了解它对匿名联合位域的看法。或者,如果你描述了你试图解决的真正问题,我们也可以考虑回答这个问题。

顺便说一句,你有这个标记的C ++,因此强烈地偏好struct X {};而不是typedef struct {} X;

答案 1 :(得分:3)

union扩展为long,因此其大小为4个字节而不是1个字节。

结果,它与结构开头的4字节偏移对齐。

此外,整个结构扩展为4字节的倍数。

所以实际结构如下:

unsigned long byte_half       :  4; // bits  0 -  3
unsigned long byte_oneAndHalf : 12; // bits  4 - 15
unsigned long byte_padding_1  : 16; // bits 16 - 31 // align union

union
{
    unsigned long byte_union_one_1 :  8; // bits 32 - 39
    unsigned long byte_union_one_2 :  8; // bits 32 - 39
    unsigned long byte_union_one_3 :  8; // bits 32 - 39
    unsigned long byte_padding_2   : 24; // bits 40 - 63 // expand union
};

unsigned long byte_one       :  8; // bits 64 - 71
unsigned long byte_padding_3 : 24; // bits 72 - 95 // expand structure

因此总大小为96位(12字节)。