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 位,那么您结构中的所有三对连续位域都至少符合其中一种情况。