结构成员对齐中的混乱

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) == 8sizeof(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个字节的填充。