Rav*_*pta 16 c memory-alignment 32bit-64bit
我正在阅读一篇关于内存中数据类型对齐的文章(这里),我无法理解一点,即
请注意,双变量将在32位机器上的8字节边界上分配,并且需要两个存储器读取周期.在64位机器上,根据存储体的数量,双变量将在8字节边界上分配,并且只需要一个存储器读周期.
我的疑问是:为什么需要在8字节边界上分配双变量而不是4字节?如果它仍然分配在4字节边界上,我们只需要2个存储器读周期(在32位机器上).如果我错了,请纠正我.
如果有人有一个关于成员/内存对齐的好教程,请分享.
Ira*_*ter 16
在2 ^ N的边界上对齐大小为2 ^ N的数据值的原因是为了避免该值将跨越高速缓存行边界分割的可能性.
x86-32处理器可以在最多两个32位存储器读取中从任何字边界(8字节对齐或不对齐)获取双精度.但是,如果值在高速缓存行边界上分割,那么获取第二个字的时间可能会很长,因为需要从内存中获取第二个高速缓存行.这会不必要地产生差的处理器性能.(实际上,当前的处理器一次不从存储器中取出32位;它们倾向于在更宽的总线上获取更大的值以实现真正高的数据带宽;实际的时间来获取两个字,如果它们在同一个缓存行中,并且已经缓存,可能只有1个时钟).
这种对齐方案的自由结果是这些值也不跨越页面边界.这避免了在数据提取过程中发生页面错误的可能性.
因此,出于性能原因,您应该在8字节边界上对齐双精度数.编译器知道这一点,只为你做.