一、概念
首先说说字节对齐这个概念问题,所谓的字节对齐,就是各种数据类型按照一定的规则在空间上排列,而不是顺序的一个接着一个的排放。这个就是对齐。而我们经常所说的对齐在N上,它的含义就是数据的存放起始地址%N==0。(这个N即为有效对齐值)
原因(为什么进行字节对齐):1、如果不进行字节对齐的话,CPU对某些数据的存取就可能加大存取周期。因为某些平台对某 些特定类型的数据只能从某些特定地址开始存取。
2、进行了字节对齐虽然提高了存取效率,但是同时浪费了空间。
几个涉及到的重要概念:自身对齐值——即数据类型自身所占字节数。
指定对齐值——程序指定对齐值
有效对齐值——前两者取其小
二、例子
struct A
{
char c;
int i;
short s;
}
我们计算sizeof(struct A),首先假设A的起始地址0x00,(其实A始终在对齐边界上,不过不影响size,这里只是为了计算方便), 接下来步骤如下:
1、数据成员c的自身对齐值=1,指定对齐值=4(这里我们默认的编译系统为4字节对齐);可以得出有效对齐值=1,因为 0x00%1=0,所以起始地址存放在0x00处。
2、数据成员i的自身对齐值=4,指定对齐值=4;可以得出有效对齐值=4,因为0x01%4!=0,因为它被存放在0x04处占用 0x04,,0x05,0x06,0x07这几个地址。
3、数据成员s的自身对齐值=2,指定对齐值=4;可以得出有效对齐值=2,因为0x08%2=0,因为它被存放在0x08处占用 0x04,0x09这几个地址。
4、最后看数据结构A的起始地址为0x0A%4!=0,因此多占用0x0A和0x0B,所以就是sizeof(struct A)=12。