将数据放在内存上时,对于存放数据的地址有对齐的限制。
对齐是指将数据放在内存上时,必须放置在特定数值的倍数的地址上。例如,“必须放置在4的倍数的地址上”。
最近设计的CPU中有着所有的数据都必须放置在该数据大小的倍数的地址上这样的限制。也就是说2字节的数据必须存放在2的倍数的地址上,4字节的数据必须存放在4的倍数的地址上。违反上述限制就会发生总线错误,导致程序异常终止。
另外,某些OS中调用外部函数时的栈帧必须以16字节为边界排列,例如Windows和Max OS X。
将结构体存放在内存上时,其成员的值由前向后依次排列。另外,结构体中各成员有着和各成员的数据类型的大小一样的对齐限制。即2字节的数据必须存放在2的倍数的地址上,4字节的数据必须存放在4的倍数的地址上。这样一来,像下面这样大小不一的成员在排列时就可能形成间隙,这样的间隙称为填充(padding)。
struct s {
char a;
char b;
int c;
}
0到1字节存放a,1到2字节存放b,4到8字节存放c,2到4字节就形成了间隙。
网友评论