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 的倍数,因此之后必须有 4 个字节的填充a[0].s
.
如果将struct
从最大到最小重新排序:
typedef struct structc_tag
{
double d;
int s;
char c;
} structc_t;
...那么唯一需要的填充是 .c
之后的 3 个字节,以使结构体大小成为 8 的倍数。这导致结构体的总大小为 16,而不是 24 .
关于结构成员对齐困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11888933/