32位Intel处理器上的内存对齐

Fre*_*ool 14 memory x86 32-bit intel alignment

Intel的32位处理器(如Pentium)具有64位宽的数据总线,因此每次访问可获取8个字节.基于此,我假设这些处理器在地址总线上发出的物理地址总是8的倍数.

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

其次,如果它是正确的,那么应该将数据结构成员对齐在8字节边界上.但我见过人们在这些处理器上使用4字节对齐.

他们怎么能这样做呢?

jal*_*alf 14

通常的经验法则(直接来自英特尔和AMD的优化手册)是每种数据类型都应该按照自己的大小对齐.一个int32应在32位边界对齐,一个int6464位边界上,依此类推.一个char适合任何地方.

另一个经验法则当然是"编译器已被告知对齐要求".您无需担心它,因为编译器知道添加正确的填充和偏移以允许有效访问数据.

唯一的例外是使用SIMD指令时,您必须手动确保大多数编译器的对齐.

其次,如果它是正确的,那么应该将数据结构成员对齐在8字节边界上.但我见过人们在这些处理器上使用4字节对齐.

我不知道这有什么不同.CPU可以简单地为包含这4个字节的64位块发出读取.这意味着它要么在请求的数据之前或之后获得4个额外的字节.但在这两种情况下,它只需要一次读取.32位数据的32位对齐确保它不会跨越64位边界.

  • 我简直不敢相信我错过了这个简单的推理.当您使用4字节实现相同的性能时,为什么要在8字节对齐中浪费4个额外字节?谢谢Jalf.你完全有道理. (5认同)

J-1*_*DiZ 7

物理总线是64位宽... 8的倍数 - >是

但是,还有两个因素需要考虑:

  1. 某些x86指令集是字节寻址的.有些是32位对齐的(这就是为什么你有4字节的东西).但是没有(核心)指令是64位对齐的.CPU可以处理未对齐的数据访问.
  2. 如果你关心性能,你应该考虑缓存行,而不是主内存.缓存行更广泛.

  • 为什么需要两次取出?它只会请求从0x000044440到0x000044447的所有数据,因为我们对0x000044444-0x000044447感兴趣,有什么问题? (3认同)