为什么存在内存对齐
1.平台原因(移植原因)
不是所有的硬件都能任意访问任意地址上的任意数据的,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出异常
2.性能原因
数据结构(尤其是栈)应该尽可能的在自然边界上对齐,为了访问未对齐的内存,CPU需要访问内存2次;访问对齐后的内存,CPU只需要访问内存1次。
在Windows的VS中默认对齐值为8
Linux中(GCC编译器)默认对齐值为4
在内存中我们一般读取数据不是按内存来读取,一般都是按内存块来读取。
未对齐的情况下,当需要访问int类型的数据时,需要CPU访问2次内存块(内存块1和内存块2)
对齐的情况下,当访问int类型的数据时,只需要CPU访问1次内存块(内存块2)即可
是一种空间换时间的做法
结构体内存对齐规则
* 第一个成员在结构体变量偏移量为0的地址
* 有效对齐值为Min(编译器默认对齐值,结构体中成员数据类型中占用内存最大值)
* 其他成员要对齐到Min(有效对齐值,该成员数据类型的内存大小)的整数倍
* ⚠结构体总大小为有效对齐值的整数倍
* 如果嵌套结构体,有效