83.说一说你理解的内存对齐以及原因
83.说一说你理解的内存对齐以及原因
1.什么是内存对齐??
内存对齐可以提高CPU的内存访问效率,因为CPU在读取内存时是按照一块一块的方式进行读取,每块的大小由内存读取粒度确定,通常为2、4、8或16个字节。
1.硬件存储和读取
一个内存是由若干个黑色的内存颗粒构成的。每一个内存颗粒叫做一个chip。每个chip内部,是由8个bank组成的。构造如下图:
每一个bank是一个二维平面上的矩阵。矩阵中每一个元素中都是保存了1个字节,也就是8个bit。
那么对于我们在应用程序中内存地址连续的8个字节,例如0x0000-0x0007,是从位于bank上的呢?直观感觉,应该是在第一个bank上吗?其实不是的,程序员视角看起来连续的0x0000-0x0007,实际上位于8个bank中,每一个bank只保存了一个字节。在物理上,他们并不连续。下图很好地阐述了实际情况。
结论:一个int会被存放在连续的bank上,而不是分别存在四个颗粒上。
2.对齐规则
1.每个特定平台上的编译器都有自己的默认“对齐系数”#pragma pack(show)可以查看
2.有效对齐值:是给定值#pragma pack(n)和结构体中最长数据类型长度中较小的那个。有效对齐值也叫对齐单位。
3.结构体第一个成员变量的偏移量(offset)为0,以后每个数据成员的起始位置要从自身大小的整数倍开始存储
4.结构体的总大小为:若没有设定对齐字节数,则最大成员为对齐字节数。若有设定对齐字节数,则对齐字节数为:min(最大成员,设定的对齐字节数)的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
所占用字节数分别为:40 36 40
参考资料来源:
程序员老吴