如果我们有一个带有位字段的结构体,那么结构体中的后续成员如何对齐?考虑以下代码:
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));
Output:
Size of A: 4
Offset of b in A: 1
Size of B: 8
Offset of c in B: 7
在这里,在第一种情况下,b
仅分配在结构的第二个字节中,没有任何填充。但是,在第二种情况下,当位字段溢出 4 个字节时,c
分配在最后(第 8)个字节。
第二种情况发生了什么?一般而言,涉及位字段的结构中的填充规则是什么?
结构体中的后续成员如何对齐?
没人知道。这是实现定义的行为,因此是特定于编译器的。
第二种情况发生了什么?
编译器可能添加了填充字节或填充位。或者结构体的位顺序可能与您预期的不同。结构体的第一项不一定包含 MSB。
一般而言,涉及位字段的结构中的填充规则是什么?
编译器可以在结构中的任何位置自由添加任何类型的填充字节(以及位字段中的填充位),只要不是在结构的最开始处完成即可。
标准对位字段的定义非常糟糕。除了在内存中随机位置分配的布尔标志块之外,它们本质上对其他任何东西都没用。我建议您对普通整数使用按位运算符。然后您将获得 100% 确定性、可移植的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)