什么是对齐?
在C/C++中,数据结构或类的成员变量,并不是按照它们的大小,一个一个紧凑地排列在空间上的。它们是按照一种特定的方法排列的,有可能在两个成员变量之间插入一个或个byte,以保证每个成员变量的起始位置是都是从某些特定的位置开始的。这就是对齐。单纯从语言上描述对齐有些枯燥难以理解,下文将配以例子说明C/C++是基于什么样的规则对齐的。
为什么要对齐?
在大多数平台上,系统从某些特定的位置开始读数据非常快,而从其它位置读数据会慢很多。C/C++是一种注重效率的语言,为了使程序速度尽可能地快,选择牺牲很少的空间,用填充byte的方式保证所有数据的存储都从这些特定的位置开始,而达到较高的运行速度。
什么是4字节对齐?
当说到一个结构体n字节对齐,包含2个信息:
(1)结构体的起始地址能被n整除
(2)结构体的总大小能被n整除
当说到一个成员变量是n字节对齐的,说明该变量的起始地址能被n整除。比如某变量的对齐字节数是4,那么它的首地址的16进制形式一定是以0/4/8/C结尾的。
在实际场景中,n可以是1、2、4、8
规则开始啦。
1.在64位系统中,默认的对齐字节是8。在32位系统中,网上查到的资料有说4也有说8,因为用的是64位系统,没有验证过32位的情况。
struct type
{
int a;
long b;
};
int main()
{
type t;
cout<<"size = "<<sizeof(t)<<endl;
cout<<"address a = "<<&t.a<<endl;
cout<<"address b = "<<&t.b<<endl;
return 0;
}
运行结果:
size = 16
address a = 0x7fffa0b9e9d0
address b = 0x7fffa0b9e9d8
排列方式:
a a a a 0 0 0 0
b b b b b b b b