【发布时间】:2013-05-18 04:19:44
【问题描述】:
众所周知,X86 CPU 有一个 64 位的数据总线。我的理解是CPU无法访问任意地址。 CPU 可以访问的地址是其数据总线宽度的整数倍。为了性能,变量应该从这些地址开始(对齐)以避免额外的内存访问。对齐到 4Byte 边界的 32 位变量会自动对齐到 8Byte(64bit) 边界,对应 x86 64 位数据总线。但为什么编译器将 128 位变量与 16 字节边界对齐?不是 8Byte 边界?
谢谢
让我把事情说得更具体一些。编译器使用变量的长度来对齐它。例如,如果一个变量的长度为 256 位,Complier 会将其对齐到 32 字节的边界。我认为没有任何一种 CPU 具有那么长的数据总线。此外,普通的 DDR 内存一次只能传输 64 位数据,尽管有缓存,内存怎么会填满 CPU 更宽的数据总线呢?还是仅通过缓存?
【问题讨论】:
-
“我们知道,X86 CPU 有一个 64 位数据总线”——这不是真的。 x86 没有说明数据总线的大小。现代处理器实际上具有比这更大的数据总线宽度。
-
处理器不从数据总线读取数据,而是从缓存中读取数据。需要 16 字节对齐以避免跨越缓存线边界。
-
@Mysticial 我认为目前最流行的 x86 CPU 具有 64 位数据总线,不是吗?
-
@iqapple 不。 Intel Core 2、Nehalem 和 Sandy Bridge 处理器具有 128 位宽的加载/存储端口。虽然不确定 AMD 的,但我认为自 K8 以来它们也有 128 位宽的加载/存储端口。高速缓存级别和内存之间的数据总线甚至很大。 (想想缓存行大小)
-
32 位变量与 4 字节边界对齐,无需在任何 CPU 上将它们与 8 字节边界对齐。
标签: c++ c memory-management assembly x86