关于字节对齐
- 前言
- 意义
- 自定义字节对齐
- 存储空间
- 内存读取效率
- 平台适应性
- 结论
前言
计算机中的内存空间大小是以字节(byte)为基本单位划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,而计算机并非逐字节大小读写内存,而是以2,4,或8的倍数的字节块来读写内存,则特定类型变量的时候经常需要在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,这就是对齐。
意义
实际上编程中,字节对齐的工作一般由编译器来自动实现了,我们可以不用刻意进行字节的对齐,但是如果对于系统性能有较高的要求时,字节对齐也是一个需要考虑的优化方向。下面基于结构体的字节对齐,以存储空间、内存读取效率、平台适应性三个方面进行介绍。
自定义字节对齐
#pragma pack (n) //编译器将按照n个字节对齐。
....
#pragma pack() //取消自定义字节对齐方式。
存储空间
如下代码:
typedef struct
{char a;short b;int c;int d;}inputInfo;typedef struct
{char a;int b;short c;int d;
}inputInfo1;
以上两个结构体占用空间分别为12与16,可以看到虽然都是相同数据变量,不同的排列顺序会有不同的影响,这是编译器自动进行的字节填充造成的,因此合理安排变量位置可以节省不少的内存占用空间。
内存读取效率
由上图可知,在没有字节对齐的情况下,变量b是通过两次才被真正读取到,读取数据总共用了3次,而字节对齐后只用了2次,因此可以提高内存的读取效率,只不过是在牺牲内存空间的条件下。
平台适应性
由于不同平台在对存储空间的处理上有很大的不同,因此,同样的结构在不同平台的对齐方式有所不同,若没有字节对齐,轻则只是影响内存的执行效率,重则会造成程序出现错误。因此我们一般可以选择两种处理方法:
- 一字节对齐(内存占用最小,但执行效率最低)
- 根据平台要求自己定义字节填充(自己均衡内存空间占用与执行效率)
结论
- 一般要求结构体成员合理安排位置,其基本的原则就是把结构中的变量按照类型大小从小到大声明,以节省空间
- 跨平台数据结构可考虑1字节对齐,节省空间但影响访问效率
- 人为地进行字节填充,可以提高访问效率,但牺牲一定的内存空间
- 当需要最大程度的内存访问效率时,可以选择最大内存数据类型的倍数进行字节对齐