读取32位架构中的短路(例如)

时间:2014-04-02 18:57:43

标签: c memory alignment word 32-bit

首先,对不起我的英语。

我知道架构非常复杂并且存在广泛的情况,但一个常见的概括是计算机架构有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⌋表示对象属于对齐的单词。

1 个答案:

答案 0 :(得分:2)

如果内存是{ff,34,f1,0a},那么对于x86处理器来说这不是问题。但是,如果存储器是{ff,ff,ff,34} {f1,aa,aa,aa},则处理器必须执行两个总线周期来检索短路的值。 (另请注意,有一些基于RISC的处理器根本不支持错位访问。)