繁体   English   中英

C ++位域结构大小定义(为什么打包得更大?)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM