一、为什么要内存对齐
简单来说,就是方便计算机去读写数据。
对齐的地址一般都是 n(n = 2、4、8)的倍数。
(1). 1 个字节的变量,例如 char 类型的变量,放在任意地址的位置上;
(2). 2 个字节的变量,例如 short 类型的变量,放在 2 的整数倍的地址上;
(3). 4 个字节的变量,例如 float、int 类型的变量,放在 4 的整数倍地址上;
(4). 8 个字节的变量,例如 long long、double 类型的变量,放在 8 的整数倍地址上;
二、内存对齐的三大规则:
第一规则: 内存中的偏移量是指成员变量的首地址相较于“0”地址处的距离,在结构体起始位置处存放的是结构体的第一个成员变量,偏移量为0,不论第一个结构体成员的大小,都是存放在0偏移量处。
第二规则: 对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。 在VS编译器下默认对齐数为8(单位byte/字节),在Linux中没有默认对齐数,对齐数就是成员的本身大小。
第三规则: 结构体的总大小,必须为最大对齐数(PPB)的整数倍大小, 而最大对齐数就为结构体成员中最大成员的大小。