2020年12月8日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
本文目录
1. 为什么需要内存对齐
(1)提升效率
CPU每次寻址都是要消费时间的,如果一次取不完数据就要取多次。比如int类型的变量a占4Byte,假设在内存中没有对齐(所谓对齐,指的是内存中数据的首地址是CPU单次获取数据大小的整数倍),且存放在0x00000003 - 0x00000006处(0x00000003不是4的整数倍)。那么每次取4字节(32位宽总线)的CPU第一次取到[0x00000000 - 0x00000003],只得到变量a的1/4数据,进而需要进行第二次取数[0x00000004 - 0x00000007],为了得到int类型的一个变量,却需要两次访问内存,并且还需要拼接处理,性能较低。
(2)可移植性
有些CPU(ARM架构的)在内存非对齐的情况下,执行二进制代码会崩溃,因为不是所有的硬件平台都能访问任意地址上的任意数据的。倘若代码移植到其他不支持的平台上,不具有可移植性。
若在编译时,将分配的内存进行对齐,单次访问内存就可以获取数据,并且具有平台可移植性。
因此,编译器(Compiler)会把我们编写的结构体,类中的成员变量进行对齐。
2. 内存对齐的规则
编译器提供手动指定对齐值的关键字 #pragma pack(N),可以手动设置对齐的字节数,比如 #pragma pack(1)、#pragma pack(4) 等。32位系统默认为4,64位系统默认为8。