一、什么是对齐
在C/C++中,数据结构或类的成员变量,并不是按照它们的大小,一个一个紧凑地排列在空间上的。它们是按照一种
特定的方法排列的,有可能在两个成员变量之间插入一个或个byte,以保证每个成员变量的起始位置是都是从某些
特定的位置开始的。这就是对齐。单纯从语言上描述对齐有些枯燥难以理解,下文将配以例子说明C/C++是基于什么
样的规则对齐的。
二、为什么对齐
在大多数平台上,系统从某些特定的位置开始读数据非常快,而从其它位置读数据会慢很多。C/C++是一种注重效率
的语言,为了使程序速度尽可能地快,选择牺牲很少的空间,用填充byte的方式保证所有数据的存储都从这些特定
的位置开始,而达到较高的运行速度。
什么是4字节对齐?
当说到一个结构体n字节对齐,包含2个信息:
(1)结构体的起始地址能被n整除
(2)结构体的总大小能被n整除
当说到一个成员变量是n字节对齐的,说明该变量的起始地址能被n整除。比如某变量的对齐字节数是4,那么它的
首地址的16进制形式一定是以0/4/8/C结尾的。
默认对齐值
1.在64位系统中,默认的对齐字节是8。在32位系统中,网上查到的资料有说4也有说8,因为用的是64位系统,没
有验证过32位的情况。
三、字节对齐
1.编译器对字节对齐的一些规则
a. 关于数据类型自身的对齐值,不同类型会按不同的字节来对齐。
b. 类、结构体的自身对齐字节值。对于结构体类型与类对象的对齐原则:使用成员当中最大的对齐字节来对
齐。比如在Struct A中,int a的对齐字节为4,比char,short都大,所以A的对齐字节为4
c. 指定对齐字节值。意思是指使用了宏 #pragma pack(n)来指定的对齐值
d. 类、结构及成员的有效对齐字节值。有效对齐值=min(类/结构体/成员的自身对齐字节值,指定对齐字节值)
。有效对齐值决定了数据的存放方 式,sizeof 运算符就是根据有效对齐值来计算成员大小的。简单来说,
有效对齐其实就是要求数据成员存放的地址值能被有效对齐值整除,即:地址值%有效对齐值=0。
2.32位机上类型长度
size of char: 1
size of int: 4
size of long:4
size of float:4
size of long long:8
size of double:8
size of long double:12
size of char * :4
3.64位机上类型长度
size of char:1
size of int:4
size of long :8
size of float :4
size of long long:8
size of double:8
size of long double:16
size of char * :8