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

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

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

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

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

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

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

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

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

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

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

请参阅这篇关于双精度浮点格式的 wiki文章

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