这里有一个struct。
struct {
unsigned int a : 8;
unsigned int : 0;
unsigned int f : 1;
} A;
Run Code Online (Sandbox Code Playgroud)
sizeof这里的structA是8个字节。我明白那个。但现在如果我在接下来再放置一个宽度为零的未命名字段,如下所示,
struct {
unsigned int a : 8;
unsigned int : 0;
unsigned int : 0;
unsigned int f : 1;
} A;
Run Code Online (Sandbox Code Playgroud)
现在,sizeofstructA仍然是 8 个字节。当我看到引用时,它说使用未命名的字段宽度 0 强制下一个字段与下一个整数对齐。所以,这里的sizeof结构体A应该是 12 个字节。或者将两个连续的未命名字段宽度设置为 0 是否不会达到预期的效果?
C17 6.7.2.1/12:
作为一种特殊情况,宽度为 0 的位字段结构成员表示没有其他位字段将被打包到放置前一个位字段(如果有)的单元中。
因此: 0意味着“停止在前一个位字段中打包位”。它并不意味着“开始将位打包到新的位字段中”。
在第一个零位字段的情况下,这意味着不应将更多位打包到a : 8存储的前一个位字段中。如果您添加另一个零位字段,则编译器仍将其视为a : 8前一个。
附带说明一下,编译器可以在位域成员之间的任意位置放置填充字节,具体取决于标准所谓的“可寻址存储单元”的内部大小。所以你永远不能假设这个结构体的大小在 32 位系统上保证为 8。