结构成员对齐困惑

标签 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 字节进行 double ?最后 4 个字节需要什么?

最佳答案

您需要考虑如果使用 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 的倍数,因此之后必须有 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/

相关文章:

java - 为什么此代码不能确保已完成完整的垃圾回收?

c - 这个结构代码是如何工作的

c++ - Django 作为 mysql 代理服务器?

c - 向我的 c 程序添加一个外部 while 循环 - 初学者 1 继续 0 停止

c++ - 堆与堆栈内存使用 C++ 用于动态创建的类

c - 如何将参数放入结构中?

c++ - 将结构转换为字符数组

c - 代码中出现奇怪的段错误

c - 尝试将数据复制到 char 指针值时出现异常

c++ - C++ 堆损坏检测工具