结构成员对齐中的混乱
typedef struct structc_tag { char c; double d; int s; } structc_t;
我在博客中读到这将占用24个字节的数据:
sizeof(char)+ 7字节填充+ sizeof(double)+ sizeof(int)+ 4字节填充= 1 + 7 + 8 + 4 + 4 = 24字节。
我的问题是为什么7字节填充,为什么我们不能在那里使用3字节填充并使用接下来的8字节为double? 最后4个字节需要什么?
如果使用malloc()
分配这些结构的数组,您需要考虑会发生什么:
structc_t *p = malloc(2 * sizeof *p);
考虑一个平台,其中sizeof(double) == 8
, sizeof(int) == 4
并且double
的所需对齐为8. malloc()
始终返回正确对齐的地址以存储任何C类型 – 所以在这种情况下a
将是8字节对齐。 填充要求自然会失败:
-
为了使
a[0].d
为8字节对齐,因此在a[0].c
之后必须有7个字节的填充; -
为了使
a[1].d
为8字节对齐,整个结构大小必须是8的倍数,因此在a[0].s
之后必须有4个字节的填充。
如果从最大到最小重新排序struct
:
typedef struct structc_tag { double d; int s; char c; } structc_t;
…然后所需的唯一填充是.c
之后的3个字节,以使结构大小为8的倍数。这导致结构的总大小为16,而不是24。
它取决于平台,但它取决于double
对齐。 如果它与8个字节对齐,这似乎是这种情况,3个字节的填充不会削减它。
如果double
对齐到4个字节,那么你就是对的,并且将使用3个字节的填充。