gpt4 book ai didi

结构成员对齐的困惑

转载 作者:行者123 更新时间:2023-12-02 22:33:07 25 4
gpt4 key购买 nike

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 的倍数,因此后面必须有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com