[英]C++ Bitfield Struct size definition (Why is it packed larger?)
我对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。 我以什么方式错误地可视化了我的结构?
预先感谢您能给我的任何帮助。
匿名联合并没有替代其属性,而是在您的位字段结构中间占据了一个四字节的块。 因此,您的前两个成员是两个字节+两个填充。 那么您的并集是一个字节加三个填充。 然后,您的最终成员是一个字节,再加上三个填充。 总数是您观察到的12。
我将尝试深入研究该标准,以确切了解其对匿名联合位域的说明。 另外,如果您描述了您要解决的实际问题,我们也可以考虑回答。
顺便说一句,您已将此标记为C ++,因此非常喜欢struct X {};
超过typedef struct {} X;
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个字节)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.