首先,对不起我的英语。
我知道架构非常复杂并且存在广泛的情况,但一个常见的概括是计算机架构有32位字,意味着寄存器,存储器访问和总线使用32位长的字(但我认为当前架构中有很多变种。)
好吧,我们假设这是规则,我们的架构是x86的小端。在这种情况下,如果我们想要读取short int
(2个字节长),则内存会读取包含short
的4字节字。我们假设在内存中包含的单词W是0xf1342ea0
:
{a0, 2e, 34, f1} // a0 is the byte in the lowest address.
我们的半字H在W的最高部分,然后,H是0xf134。我知道处理器从内存中接收short
移位的单词:
{34, f1, 00, 00}
因为0x0000f134等于0xf134。
考虑到这一点,由于处理器长4个字节,因此无论如何都需要移位,为什么必须在2字节字边界中对齐2字节数据呢?
换句话说:
为什么鼓励建议不要在单词中读取short
0xf134:
{ff, 34, f1, 0a}
编辑:表达同样疑问的其他方式是:为什么对齐的定义是
A object of size N and address d is aligned if d is divisible by N.
而不是:
A object of size N and direction d is aligned respect to an architecture
of B bytes if d is divisible by B, or ⌊d/B⌋ == ⌊(d+N)/B⌋ if N < B.
注意:属性⌊d/B⌋==⌊(d + N)/B⌋表示对象属于对齐的单词。
答案 0 :(得分:2)
如果内存是{ff,34,f1,0a},那么对于x86处理器来说这不是问题。但是,如果存储器是{ff,ff,ff,34} {f1,aa,aa,aa},则处理器必须执行两个总线周期来检索短路的值。 (另请注意,有一些基于RISC的处理器根本不支持错位访问。)