我对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。我以什么方式错误地可视化我的结构?
提前感谢您提供任何帮助。
答案 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字节)。