🌱浅谈内存对齐
什么是内存对齐
简单来说,就是数据存放的起始地址需要是字长的整数倍。 -> 不只是读取数据长度为Word,地址起点也要是Word的整数倍
为什么需要对齐
因为CPU访问内存不是一个字节一个字节地读取,而是通过数据总线一次读取一个字长(Word)的数据。 假设一个CPU的数据总线宽度是32位,那这个CPU一次最高效的内存读取操作就是4 Byte。 如果需要读取不对齐的数据,如6Byte的变量,就需要读取两次,然后将两次读取的结果拼接起来。
非对齐访问异常
现代的CPU架构,如x86,会处理上述的多次读取和拼接操作,对程序员是透明的,但还是会消耗性能。 但很多嵌入式处理器,如老ARM架构,为了降低功耗和成本,直接不支持非对齐访问异常。此时如果访问的地址不符合数据对齐要求,就会触发一个硬件异常。
C内存分配如何对齐
``` // 非对齐分配 char* buffer = malloc(size); chat* ptr = buffer + 1;
// 使用对齐分配函数 void* ptr = memalign(4, size); // 4Byte对齐
// 结构体对齐 struct attribute((aligned(4))) My { char b; int a; };
// 编译器指令对齐 #pragma pack(4) struct My { int a; char b; }; #pragma pack()