英特尔的32位处理器,如奔腾系列,拥有64位宽数据总线,因此每次访问可以获取8个字节。基于这个事实,我假设这些处理器发出的物理地址在地址总线上总是8的倍数。
首先,这个结论是否正确?
其次,如果这个结论正确,那么数据结构成员应该按照8字节对齐。但是我看到有人在这些处理器上使用4字节对齐。
他们如何证明这样做是合理的?
英特尔的32位处理器,如奔腾系列,拥有64位宽数据总线,因此每次访问可以获取8个字节。基于这个事实,我假设这些处理器发出的物理地址在地址总线上总是8的倍数。
首先,这个结论是否正确?
其次,如果这个结论正确,那么数据结构成员应该按照8字节对齐。但是我看到有人在这些处理器上使用4字节对齐。
他们如何证明这样做是合理的?
int32
应该在32位边界上对齐,int64
在64位边界上对齐,等等。字符可以放在任何地方。物理总线宽度为64位,是8的倍数 --> 是的
但是,还有两个因素需要考虑:
对于随机访问,只要数据没有错位(例如跨越边界),我认为这并不重要;硬件可以使用简单的AND构造找到正确的地址和数据偏移量。当一个读取操作不足以获取一个值时,速度会变慢。这也是编译器通常将小值(字节等)放在一起的原因,因为它们不必在特定的偏移量上;short应该在偶数地址上,32位在4字节地址上,64位在8字节地址上。
请注意,如果涉及缓存和线性数据访问,则情况将有所不同。
你所提到的64位总线是用来供给缓存的。作为CPU,总是读写整个缓存行。缓存行的大小始终是8的倍数,并且其物理地址确实对齐于8字节偏移量。
从缓存到寄存器的传输不使用外部数据总线,因此该总线的宽度无关紧要。