我正在阅读一篇关于内存中数据类型对齐的文章(here),我无法理解一点,即
Note that a double variable will be allocated on 8 byte boundary on 32 bit machine and requires two memory read cycles. On a 64 bit machine, based on number of banks, double variable will be allocated on 8 byte boundary and requires only one memory read cycle.
我的疑问是:为什么双变量需要分配在 8 字节边界上而不是 4 字节边界上?如果它分配在 4 字节边界上,我们仍然只需要 2 个内存读取周期(在 32 位机器上)。如果我错了,请纠正我。
此外,如果有人对成员/内存对齐有很好的教程,请分享。
最佳答案
将大小为 2^N 的数据值对齐到 2^N 的边界上的原因是为了避免该值将跨缓存行边界拆分的可能性。
x86-32 处理器可以在最多两次 32 位内存读取中从任何字边界(8 字节对齐或不对齐)获取 double 。但是,如果值跨高速缓存行边界拆分,则获取第二个字的时间可能会很长,因为需要从内存中获取第二个高速缓存行。这会不必要地产生较差的处理器性能。 (实际上,当前的处理器不会一次从内存中获取 32 位;它们倾向于在更宽的总线上获取更大的值以实现非常高的数据带宽;如果它们获取两个字的实际时间在同一个缓存行中,并且已经缓存,可能只有 1 个时钟)。
此对齐方案的一个自由结果是这些值也不会跨越页面边界。这避免了在数据获取过程中出现页面错误的可能性。
因此,出于性能原因,您应该在 8 字节边界上对齐 double 。编译器知道这一点并为您完成。
关于c - 为什么 C 中的 double 是 8 字节对齐的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10913120/