内存对齐
内存对齐是为了使用空间换时间的一种策略
为什么需要内存对齐
cpu访问内存时,并不是逐个字节访问,而是以字长为单位访问,比如64位的cpu,字长为8个字节,那么cpu访问内存的单位也是4字节。(忽略cpu访问缓存而不是内存)
比如16个字节,一次读取8个字节那么只需要读取2次。
举例
假如有以下结构体
1 | struct Test{ |
a占一个字节,b占8个字节,如果按照内存对齐的方式,cpu只需要读取两次,第一次读取a,第二次读取b。如果不是按照内存对齐方式,第一次读取a变量,第二次读取b变量的时候,需要读取a变量,再偏移7个字节,读取第二个8字节,偏移一位。cpu需要读取三次。
规则
- 对于内置类型,只要它的地址是它长度的整数倍即可。
- 对于 struct,其中的每个数据都要对齐,struct 本身也要向其中最大的那个数据对齐。
- 对于 union,按照其中最长的那个数据对齐。
- 对于数组,无需特殊处理,因为其中每一个数据都对齐了,数组本身就对齐了。