结构成员对齐中的混乱

时间:2012-08-09 17:36:50

标签: c memory-management struct

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字节进行双重填充?最后4个字节需要什么?

2 个答案:

答案 0 :(得分:3)

如果使用malloc()分配这些结构的数组,您需要考虑会发生什么:

structc_t *p = malloc(2 * sizeof *p);

考虑一个sizeof(double) == 8sizeof(int) == 4double所需对齐方式为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。

答案 1 :(得分:2)

它取决于平台,但取决于double对齐的内容。如果它与8个字节对齐,这似乎是这种情况,3个字节的填充不会削减它。

如果double与4个字节对齐,那么你就是对的,并且将使用3个字节的填充。