英特尔的32位处理诸如奔腾有64位的广泛的数据总和因此取8字节每访问。在此基础上,我假定的实际地址,这些处理这些地址上巴士总数倍8.

首先,这一结论是否正确?

其次,如果它是正确的,那么一个应当调整数据结构的成员在一个8字节的边界。但我见过的人,使用4个字节的准,而不是在这些处理器。

他们怎么能有理由这样做?

有帮助吗?

解决方案

拇指(直从英特尔和AMD的优化手册)的通常的规则是,每个数据类型应通过其自身的大小来对齐。一个int32应该32位边界上对齐,在64位边界上的int64,依此类推。一个char将适合就好的任何地方。

拇指的另一条规则是,当然“编译器已经讲述了对齐需求”。你并不需要担心,因为编译器知道添加的右填充和偏移以允许对数据的高效访问。

唯一的例外是用SIMD指令,其中必须手动确保大多数的编译器对齐的工作时。

  

其次,如果它是正确的,则一个   应该对齐数据结构成员上   一个8字节边界。但我见过   人们使用4字节对齐   代替这些处理器。

我看不出有差别。 CPU可以简单地发出包含这些4个字节的64位的块的读取。这意味着它无论是请求的数据之前得到4个额外的字节,或之后。但是,在这两种情况下,只需要一个单一的读取。 32位宽的数据的32位的对准确保它不会跨越64位边界。

其他提示

物理总是64位。多的8-->是的

然而,有两个因素需要考虑:

  1. 一些x86指示设置的字节的解决。有些是32位对准(这就是为什么你们4个字节的事)。但是,没有(核心)指令是64位对准。CPU可以处理未数据访问。
  2. 如果你关心的效能,你应该认为关于缓线,不主存储器。缓线宽得多。

他们有理由这样做,因为更改为8字节对齐将构成ABI的变化,边际性能的提高是不值得的麻烦。

由于别人已经说过的,高速缓存行的事。所有实际的存储器总线上的访问是在高速缓存行条款(64个字节在x86,这个)。看到已经提到的“是什么每个程序员需要了解内存”的文档。因此实际的存储器流量64字节对齐的。

有关的随机接入,并且只要数据不是未对齐的(例如,越过边界),我不认为它很重要得多;正确的地址和数据偏移量可以用一个简单的被发现和硬件建设。当一个读访问不足以得到一个价值它变得缓慢。这也是为什么编译器通常把小的值(字节数等)在一起,因为他们不必是在特定的一个偏移;短裤应该是偶地址,在4字节的地址的32位和8个字节的地址的64位。

请注意,如果有高速缓存involed和线性数据访问,东西将是不同的。

在64位总线你指的馈送缓存。作为CPU,总是读取和写入整个高速缓存行。一个高速缓存行的大小始终是8的倍数,和它的物理地址是在8个字节偏移确实对准。

高速缓存到寄存器传输不使用外部数据总线,从而使总线的宽度是无关紧要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top