c - C 结构的数据对齐

标签 c memory struct memory-alignment

CS:APP 中存在以下结构中所有字段的字节偏移量的问题(3.45)。

struct {
  int    *a;
  float  b;
  char   c;
  short  d;
  long   e;
  double f;
  int    g;
  char   *h;
} rec;

这是书中的答案,它给 c 一个三个字节的填充,d 一个两个字节的填充,g 一个四个字节填充。

field  size  offset
-----  ----  ------
a      8     0
b      4     8
c      1     12
d      2     16
e      8     24
f      8     32
g      4     40
h      8     48

这是我的解决方案,它只给 c 一个字节的填充和 g 一个四字节的填充。

field  size  offset
-----  ----  ------
a      8     0
b      4     8
c      1     12
d      2     14
e      8     16
f      8     24
g      4     32
h      8     40

那么,我的解决方案有什么问题?它似乎符合对齐规则(编辑*这里的“规则”只是我自己的一个简化概念总结,它不是完整的或通用的),所有对象的偏移量都是对象大小的倍数。

非常感谢任何解释。

最佳答案

答案取决于编译器、平台和编译选项。一些例子: enter image description here

https://godbolt.org/z/4tAzB_

这本书的作者恐怕不明白这个话题。

关于c - C 结构的数据对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56877547/

相关文章:

C - 为什么我的缓冲区打印不正确?

windows - Windows 任务管理器中我的 MMF(内存映射文件)内存在哪里?

C 中具有负索引的数组的 Calloc

c - 链表 C 程序中的段错误

c - 填充 int 变量中的字节

c++ - 为什么 vsnprintf 是安全的?

c - 避免 2 的幂以实现缓存友好性

从头文件调用 Struct 到 main 函数

c - 将 const 指针传递给结构 vs 按值传递

c - 为什么这个程序中的指针指向不相关的字段?