一、什么是对齐,以及为什么要对齐:
1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
2. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低 字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。
上面例子的运行结果如下:
struct A length:7
struct B length:12
struct C length:6
struct D length:8
对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
而结构体和类的自身对齐值是其所有成员中自身对齐值对大的那个值。
在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的自身对齐值最大的元素比处理器的位数小的时候,便以该元素为对齐单元,也就说说结构体的有效长度一定是最长元素的整数倍。如果结构体内,存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单元。但是结构体内类型相同的连续元素将在连续的空间内,和数组一样。
如果结构体大小小于最长元素的整数倍或处理器位数,则补空字节。如上面的例子中的struct D, 结构体大小是6,但是6不是long长度的整数倍,所有就要补2个空字节,此时结构体的sizeof(struct D)为8字节.