如果我们有一个带有位域的结构体,那么结构体中的后续成员如何对齐?考虑以下代码:
struct A{
int a:1;
char b; // at offset 1
};
struct B{
int a:16;
int b: 17;
char c; // at offset 7
};
printf("Size of A: %d\n", (int)sizeof(struct A));
printf("Offset of b in A: %d\n", (int)offsetof(struct A, b));
printf("Size of B: %d\n", (int)sizeof(struct B));
printf("Offset of c in B: %d\n", (int)offsetof(struct B, c));
输出:
Size of A: 4
Offset of b in A: 1
Size of B: 8
Offset of c in B: 7
在这里,在第一种情况下,b
仅在结构的第二个字节中分配,没有任何填充。但是,在第二种情况下,当位域溢出 4 个字节时,c
在最后(第 8 个)字节中分配。
第二种情况发生了什么?一般来说,在涉及位字段的结构中填充的规则是什么?