c - 为什么 C 中的 double 是 8 字节对齐的?

标签 c 32bit-64bit memory-alignment

我正在阅读一篇关于内存中数据类型对齐的文章(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/

相关文章:

iphone - 如何在运行时指定一个数组?

c - 十六进制值表示和字节顺序说明

64-bit - 64 位/32 位的底层优势和劣势是什么?

c# - x86 控制台应用程序不能在 64 位计算机上运行(调试器除外)

c++ - 为较大的数组分配对齐的内存

c - sigkill 不会终止 C 程序

c - 错误: unused variable (struct)

java - 为什么当我在 64 位 jvm 中打开带有小程序的页面时 IE 11 会崩溃,但在 32 位 jvm 中却可以正常工作?

c++ - Gcc 自定义运算符 new[] 和 delete[] 对对齐的类有问题 - addresssanitizer 报告缓冲区溢出

c - 在小结构的末尾而不是在 2 个成员之间进行对齐填充是否对性能更好?