我知道有些处理器因未对齐的数据而失败,而其他处理器就像那些常见的x86一样,只会慢一点。
我的问题是为什么?为什么x86处理器从指针0x12345679
获取数据比从指针0x12345678
获取数据更难?为了清楚起见,我知道如果数据在多个页面中可能会发生页面错误,并且我知道可能需要从内存中获取更多数据(一个部分用于值的开始,一个用于结束) ,但这并不总是正确的,这不是我的问题所在。我问,为什么总是慢?
假设内存从0x10000000
开始。为什么处理器从short
获取2字节0x10000001
比从0x10000002
获取更加困难?为什么从int
获取4个字节0x10000001
比从0x10000000
获取更难?等等。
答案 0 :(得分:4)
因为数据总线比8位宽。
假设数据总线是32位。要从地址0x10000001获得16位,它必须获取从0x10000000开始的四个字节并移动该值以获得中间的两个字节。
要从地址0x10000003获得16位,它必须得到从0x10000000和0x10000004开始的字,并使用每个值中的一个字节。
答案 1 :(得分:3)
处理器只能以对齐的方式访问内存。这是处理器和存储器之间的互连如何运作的结果。
当处理器支持未对齐的读取时,实际发生的是处理器发出两个单独的读取(或一次读取较大的读取)并将这些部分拼接在一起,这就是为什么它比对齐读取慢的原因。
答案 2 :(得分:1)
一个例子:如果数据总线是32位且32位值不在32位边界上,则必须在多个操作中获取字节并移动以将值正确加载到处理器寄存器中。