18

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

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

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

另外,如果有人对成员/内存对齐有很好的教程,请分享。

4

4 回答 4

19

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

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

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

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

于 2012-06-06T13:35:14.080 回答
3

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

于 2012-06-06T13:51:40.920 回答
1

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

于 2015-10-28T22:42:25.873 回答
-2

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

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

于 2012-06-06T11:47:05.910 回答