64位结构实际上填充到12个字节
考虑下面的结构,其中位域大小的总和是 64 位。为什么sizeof说这个结构是12个字节,什么时候应该是8个?
typedef struct wl_Ls {
unsigned int total:17;
unsigned int used:17;
unsigned int entrySize:17;
_Bool point:1;
} wl_Ls;
[解决方案:] 对前 2 或 3 名成员使用 64 位类型修复程序修复它。解释在标记为解决方案的答案中
回答
位域并不总是保证紧密地打包在一起。允许编译器在位域之间插入填充的两种情况是:当两个连续位域的类型不同时,以及当位域不适合在“分配单元”中仍然可用的位数时位域的类型。
假设unsigned int是 32 位,则结构中的所有三对连续位域至少符合其中一种情况。
- 它不能将两个 17 位字段组合成同一个 `unsigned int`。所以它必须为每个成员使用一个单独的 `unsigned int`。3x4 = 12 字节。