为什么C中的双精度是8字节对齐?

时间:2012-06-06 11:16:45

标签: c 32bit-64bit memory-alignment

我正在阅读一篇关于内存中数据类型对齐的文章(here),我无法理解一点,即

  

请注意,双变量将在32字节边界上分配   位机并需要两个存储器读周期。在64位机器上,   根据库数,双变量将分配在8字节上   边界并且只需要一个存储器读周期。

我的疑问是:为什么需要在8字节边界上分配双变量而不是4字节?如果它仍然分配在4字节边界上,我们只需要2个存储器读周期(在32位机器上)。如果我错了,请纠正我。

此外,如果某人有一个关于成员/内存对齐的好教程,请分享。

4 个答案:

答案 0 :(得分:16)

在2 ^ N的边界上对齐大小为2 ^ N的数据值的原因是为了避免该值在高速缓存行边界上分割的可能性。

x86-32处理器可以在最多两个32位内存读取中从任何字边界(8字节对齐或不对齐)获取双精度。但是,如果值在高速缓存行边界上分割,那么获取第二个字的时间可能会很长,因为需要从内存中获取第二个高速缓存行。这会不必要地产生差的处理器性能。 (实际上,当前的处理器一次不从存储器中取出32位;它们倾向于在更宽的总线上获取更大的值以实现真正高的数据带宽;实际的时间来获取两个字,如果它们在同一个缓存行中,并且已经缓存,可能只有1个时钟。

这种对齐方案的自由结果是这些值也不跨越页面边界。这样可以避免在数据提取过程中发生页面错误。

因此,出于性能原因,您应该在8字节边界上对齐双精度数。编译器知道这一点并且只是为你做。

答案 1 :(得分:1)

将边界上的值与其大小对齐使得它很容易被分割为两个缓存行。拆分两个cachlines中的值意味着在将缓存行驱逐到后备存储时需要额外的工作(两个缓存行将被逐出;而不是一个),这是无用的内存总线负载。

答案 2 :(得分:1)

32位架构上的双字节8字节对齐并不会减少内存读取,但在减少缓存访问方面仍然可以提高系统性能。请阅读以下内容: https://stackoverflow.com/a/21220331/5038027

答案 3 :(得分:-2)

请参阅此Wiki文章,了解double precision floating point format

内存周期数取决于您的硬件架构,它决定了您拥有多少个RAM bank。如果你有一个32位架构和4个RAM存储区,你只需要2个存储周期来读取。(每个RAM存储区贡献1个字节)