2
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 个字节需要什么?

4

2 回答 2

3

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

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

考虑一个平台,其中sizeof(double) == 8sizeof(int) == 4所需的对齐方式double是 8。malloc()始终返回正确对齐的地址以存储任何 C 类型 - 因此在这种情况下a将是 8 字节对齐的。然后填充要求自然会下降:

  • 为了实现a[0].d8 字节对齐,在 ; 之后必须有 7 个字节的填充a[0].c

  • 为了实现a[1].d8 字节对齐,整个结构体的大小必须是 8 的倍数,因此 . 之后必须有 4 个字节的填充a[0].s

如果您从大到小重新排序struct

typedef struct structc_tag
{
   double      d;
   int         s;
   char        c;
} structc_t;

...然后唯一需要的填充是 3 个字节之后.c,使结构大小为 8 的倍数。这导致结构的总大小为 16,而不是 24。

于 2012-08-10T04:41:36.500 回答
2

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

如果double对齐到 4 个字节,那么您是对的,将使用 3 个字节的填充。

于 2012-08-09T17:38:35.420 回答