关于内存对齐
关于内存对齐
为什么要关心对齐
- 你正在编写的代码在性能(CPU、Memory)方面有一定的要求
- 你正在处理向量方面的指令
- 某些硬件平台(ARM)体系不支持未对齐的内存访问
为什么要做内存对齐
- 平台(移植性)原因:不是所有的硬件平台都能够访问任意地址上的任意数据。例如:特定的硬件平台只允许在特定地址获取特定类型的数据,否则会导致异常情况
- 性能原因:操作系统并非一个字节一个字节访问内存,而是按2, 4, 8这样的字长来访问。因此,当CPU从存储器读数据到寄存器,或者从寄存器写数据到存储器,IO的数据长度通常是字长。
- 若访问未对齐的内存,将会导致 CPU 进行两次内存访问,并且要花费额外的时钟周期来处理对齐及运算。而本身就对齐的内存仅需要一次访问就可以完成读取动作
原理
首先,要考虑计算机访问一次内存时取的字节数,32位是4字,64位是8字。出于数据访问性能考虑,数据在内存中的位置应该满足尽量能以最少的次数被访问到,因此当数据存储位置出现跨访问边界时,就会多一次的数据访问。因此数据存放的位置很重要,必须满足存放的地址是2的倍数。
本文由作者按照 CC BY 4.0 进行授权