什么是4字节对齐?4字节对齐有什么好处,有什么坏处?分析一波。
首先先定义一个结构体。
typedef struct AA {
char a;
int b;
short c;
} AA;
AA aa;
32位处理器,如果没有采用4字节对齐,首先结构体变量aa存放在内存中的起始地址为0x00,那么其成员变量a的起始地址为0x00,成员变量b的起始地址为0x01,结构体变量aa一共占用了5个字节。当CPU要对成员变量a进行访问时,只需要一个读周期即可。而如若要对成员变量b进行访问,首先CPU用了1个读周期从0x00-0x03地址读取4个字节,然后将0x01-0x03地址的3个字节暂存,接着又花费了1个读周期读取了从0x04-0x07地址的4个字节数据,将0x04这个地址取得的字节与上一个周期暂存的3个字节进行拼接从而读取到成员变量b的值。为读取这个成员变量b,CPU花费2个周期。
如果数据成员b的起始地址被放在了0x04处,那么读取其所花费的周期就变成了1,4字节对齐效率提高了,但同时也浪费了0x01-0x03地址上的3个字节的空间。
有3个重要的概念:自身对齐值,指定对齐值和有效对齐值。
1. 自身对齐值:即数据类型的自身的对齐值。
对于32位处理器,char型的数据,其自身对齐值为1字节;short型的数据,其自身对齐值为2字节;int类型,其自身对齐值为4字节;struct和class类型的数据其自身对齐值为其成员变量中自身对齐值最大的那个值。
2. 指定对齐值:指定的对齐值,比如指定4字节对齐。
3. 有效对齐值:上述两个对齐值中最小的那个。
上面的例子,sizeof(aa) = 1(char) + 3个空闲空间 + 4(int) + 2(short) + 2个空闲空间。