关于对齐值的理解

花了点时间,把编译器中对变量的地址进行对齐的原因搞懂了,现在记录一下我的理解:

其实不同的系统会对每个变量设置不同的自然对齐,32位系统下的自然对齐值是4,64位系统下的自然对齐值是8,这是为了匹配每次读写内存处理的字节数,32位机每次固定是4字节,64位机每次固定是8字节,这样的好处在于,对于每次对某个值的读入,都可以恰好与cpu中储存字节的边界对齐,使得对于每一类型的变量的读取次数都是最少的,而不会出现以下情况:
double类型的读取,假设cpu每次读取4字节

在设置自然对齐的情况下只需要两次内存载入(读入cpu的字节中刚刚好都是double数据),但是由于错乱的排列使得处理这个double类型的变量需要对内存进行3次读取(如上图)。
如果每种类型的变量的对齐值不是自然对齐值,而是设置成每种变量所占字节大小的话,会发现也是可以达到读取次数最小的要求的:
这是每种数据类型的对齐值都是各自所占字节数的情况
其实设置对齐值的目的就是为了让读取次数最少,是一种以空间换取时间的方式,因为这样可能会导致变量的存储由于对齐值的原因,导致不同类型数据的存储往往不会紧挨着,而会出现很多空隙。
自然对齐值为4是足够提高效率的(在32位机上),但是为了尽量减少空间的消耗,我们才会将不同类型变量的对齐值变成对应所占字节的大小。
但如果要保证数据的地址卡在读入cpu的字节块的边界,从而避免读入cpu中通过偏移来寻找数据的话,则只好将每个类型数据的对齐值都设置为对应系统每次读写的字节数了。

猜你喜欢

转载自blog.csdn.net/qq_51690757/article/details/112498128