首先,为什么进行struct内存对齐,CPU以一个固定的块大小读取数据,和计算机位数有关。64位主机CPU一次读取的块为8字节,32位机CPU一次读取的块为4字节。知道了主机是按一个固定的块读取大小,假设这么一个场景,32位机,4字节的数据,分布在两个块中,假设为字节分布在第2到5个字节.即0-3为第一个块,4-7为第二个块,这么四个字节的数据,需要拿出两个块,一定程度上降低了CPU读取的一个效率。如果上面的数据,我们直接第一个块中的2-3字节弃用,全部放到第二个块中,那么我们的CPU只需要读取一次,一定程度上提高了计算机的整体效率。但是大家也可以发现浪费了空间,实践证明,这种空间换时间的做法是值得的。
这里的CPU读取的一个块的大小叫做系统默认对齐字节数或者对齐模数比。
struct内存对齐主要有四条规则:
规则一:首个成员起始地址为0.(首成员偏移)
规则二:struct内部成员的起始地址为系统默认对齐字节数和该成员的大小两者较小值的整数倍。(普通型成员对齐)
规则三:结构体嵌套情况下,结构体成员的起始地址为结构体成员内部最大成员大小的整数倍,占据地址按照结构体成员本身大小计算。(结构体类型成员对齐)
规则四:结构体所有内部成员对齐结束后,再对结构体整体进行对齐。该结构体整体占用的内存大小要为结构体中最大的变量类型与系统默认对齐字节数中的较小值的整数倍。(结构体整体对齐)
通过上面的讲解可知,规则一在有成员的时候必定会使用,规则二在成员数大于等于2的时候必定会使用,规则三在结构体里面嵌套结构体的时候必定会使用,规则四无条件会被使用。
所以很常见的两种情况分别是:1.规则一,规则二,规则四一起使用。2.四条规则全部使用。
利用规则一,规则二,规则四进行内存对齐
四条规则全部使用
参考博客:https://www.csdn.net/tags/NtDaUg2sMjUzNTItYmxvZwO0O0OO0O0O.html