之所以会有数据对齐是因为访问内存的硬件电路特性。地址总线按对齐地址访问,以4自己对齐为例。如果想得到0x00000001开始的4个字节内容,系统需要以0x00000000开始读4个字节,取后面3个,再以0x00000004开始读4个字节取第一个,组合得到想要的4个字节。这样取数的速度就会变慢,增加系统负担,降低性能。如果一开始就对齐到0x00000000,就只需要一次读写即可。
class A1{
public:
int a;
staticint b;
A1();
~A1();
};
classA2{
public:
double d;//8
float a;//4
int b;//4
char c;//1
A2();
~A2();
};
sizeof(A1);
sizeof(A2);
因为静态变量是放在全局数据区,而sizeof是计算栈中分配的大小,所以sizeof(A1)是4.
为了方便对结构体内元素的访问和管理,以结构体里面最长元素为对齐单位,结构体的长度一定是最长的数据元素的整数倍。如果大于处理器位数,以处理器位数为对齐单位。A2以8为对齐单位,sizeof(A12)是24.