包含位字段的结构的大小

use*_*292 5 c c++ sizeof bit-fields structure-packing

可能重复:
为什么structof sizeof不等于每个成员的sizeof之和?

我试图理解位域的概念.但我无法找到CASE III中以下结构的大小为8字节的原因.

案例I:

struct B    
{
    unsigned char c;  // +8 bits
} b;
Run Code Online (Sandbox Code Playgroud)

的sizeof(B); //输出:1(因为unsigned char在我的系统上占用1个字节)

案例II:

struct B
{
    unsigned b: 1;
} b;

 sizeof(b); // Output: 4 (because unsigned takes 4 bytes on my system)
Run Code Online (Sandbox Code Playgroud)

案例III:

struct B
{
    unsigned char c;  // +8 bits
    unsigned b: 1;    // +1 bit
} b;

sizeof(b); // Output: 8 
Run Code Online (Sandbox Code Playgroud)

我不明白为什么案例III的输出为8.我期待1(char)+ 4(无符号)= 5.

rod*_*igo 7

您可以通过使用来检查结构的布局offsetof,但它将是以下内容:

struct B
{
    unsigned char c;  // +8 bits
    unsigned char pad[3]; //padding
    unsigned int bint; //your b:1 will be the first byte of this one
} b;
Run Code Online (Sandbox Code Playgroud)

现在,很明显(在一个32位的拱门中)sizeof(b)将是8,不是吗?

问题是,为什么3个字节的填充,而不是更多或更少?

答案是字段到结构中的偏移量与字段本身的类型具有相同的对齐要求.在你的体系结构中,整数是4字节对齐的,所以offsetof(b, bint)必须是4的倍数.它不能是0,因为有c前面的,所以它将是4.如果字段bint从偏移量4开始并且是4字节长,那么结构的大小是8.

另一种看待它的方法是结构的对齐要求是其任何字段中最大的,因此这B将是4字节对齐(因为它是您的位字段).但是一个类型的大小必须是对齐的倍数,4是不够的,所以它将是8.