在面试或工作中,经常会遇到内存对齐的问题。这里结合我的理解谈一谈对内存对齐的理解。
1. 为什么要内存对齐,不对齐会怎么样?
内存中存放数据是为了给CPU使用,CPU访问内存数据时会受到地址总线宽度的限制,也就是一次能从内存中拿多少数据到CPU(这里我们忽略CPU高速缓存)。而且,CPU从内存中获取数据时起始地址必须是地址总线宽度的倍数。
例如:CPU地址总线是64位(bit,8字节),当一个int(4字节)存储到地址: 0x06 时,CPU如何获取这个int值?
第一步:读取0x00~0x08 8个字节,然后保存后两个字节到 int 的前两个字节。
第二步:读取0x08~0x0F 8个字节,然后保存前两个字节到int的后两个字节。
图1-内存访问
上面的例子可以看到,从内存中读取一个int到CPU中需要从内存中读取两次。这样大大降低了执行的效率,如何提升性能? 答案就是内存对齐!
2. 内存对齐的单位是什么?
通过上面的分析,知道内存对齐的目的是为了让CPU能一次获取到数据,从而提升性能。学过汇编会了解,CPU只能使用基本类型,char, short, int, long, float, double 等,不能使用数组或结构体等复合类型