结构体内存对齐详细解答!

471 阅读1分钟

结构体内存对齐详细解答!

结构体内存对齐规则

  1. 第一个成员在结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数:编译器默认的对齐数与该成员大小的较小值
  3. 结构体总大小为最大对齐数的整数倍(每个成员变量都有一个对齐数)
  4. 如果嵌套了结构体,嵌套的结构体对齐到自己最大对齐数的整数倍,结构体的整体大小就是最大对齐数的整数倍。

看图解题

image.png 以上代码中,结构体成员变量一样,但是顺序不一样,导致两个结构体所占内存大小不同。

为什么会有结构体内存对齐

  1. 平台原因:不是所有硬件可以访问任意地址上的任意数据,某些平台只能在某些地址处读取特定类型数据,否则会硬件异常。
  2. 性能原因:数据结构应该尽可能在自然边界上对齐。为了访问未对齐的内存,处理器需要作两次内存访问;而对于对齐的内存,处理器仅需要一次访问。

如何设计结构体

为了使结构体占用的内存小一些,应该尽可能让占用空间小的内存集中在一起,比如char char int int double double。

如何修改默认对齐数

#pragma pack(设置的对齐数) 注意:Linux系统下不设置对齐数,对齐数字就是结构体成员自身的大小。

附加练习

image.png

image.png

参考引用(这两篇文章都讲得很好):blog.csdn.net/lffup/artic… t.csdn.cn/hqjVK