64位结构实际上被填充为12个字节
64-bit structure is actually padded to 12 bytes
考虑下面的结构,其中位域大小的总和为 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 位类型修复修复它。解释在标记为 Solution
的答案中
位域并不总是保证紧密地打包在一起。允许编译器在位域之间插入填充的两种情况是:当两个连续的位域不是同一类型时,以及当位域不适合“分配单元”中仍然可用的位数时位域的类型。
假设 unsigned int
是 32 位,您的结构中的所有三对连续位域至少符合其中一种情况。
考虑下面的结构,其中位域大小的总和为 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 位类型修复修复它。解释在标记为 Solution
的答案中位域并不总是保证紧密地打包在一起。允许编译器在位域之间插入填充的两种情况是:当两个连续的位域不是同一类型时,以及当位域不适合“分配单元”中仍然可用的位数时位域的类型。
假设 unsigned int
是 32 位,您的结构中的所有三对连续位域至少符合其中一种情况。