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个字节需要什么?
答案 0 :(得分:3)
如果使用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。
答案 1 :(得分:2)
它取决于平台,但取决于double
对齐的内容。如果它与8个字节对齐,这似乎是这种情况,3个字节的填充不会削减它。
如果double
与4个字节对齐,那么你就是对的,并且将使用3个字节的填充。