什么是字节对齐?
变量存取地址为在它所属类型的倍数的地址单元上,例如double要放在8的倍数的地址上,int要放在4的倍数的地址上…
字节对齐的原因
这样做的原因是,内存的存取并不是按照1个字节,而是按照计算机位数对应的字节来访问,例如:在32位机器上,每次访问4个字节,64位机器上,每次访问8字节。如果按照字节对齐的方式,访问数据速度更快。如果不按照字节对齐,则访问数据的周期数会增加。
字节对齐与字节不对齐的对比
这里以 32 位机器为例。
1. 访问周期
- 按照字节对齐,访问 double 数据,只需要 2 个指令周期,int 型变量只需要 1 个指令周期。
- 如果字节不对齐,访问 double 时则可能需要 3 个指令周期,而访问 short 型变量有可能需要 2 个指令周期。
2.存储空间
显然字节对齐会占用更大的存储空间,字节不对齐会节约空间。
3. 总结
字节对齐虽然占用更大的空间,但是它带来的是访问速度的提高,目前存储空间已经足够我们使用,我们更在意的是数据的访问速度。
字节对齐的设定
- #pragma pack(n) : 当n比自然边界大时,按照自然边界对齐。当n比自然边界小的时候,按照n对齐。
- attribute((aligned(m)))
- attribute((packed))
示例
uint64_t 自然边界为8字节,但是#pragma park 中的 n = 4< 8,所以按照n,即4字节对齐,所以f5放在地址12而非地址16处。