小编典典

了解单词对齐

algorithm

我了解访问内存以便对齐的含义,但是我不明白为什么这样做是必要的。例如,为什么我可以从一个地址访问一个字节,0x…1但不能从同一个地址访问一个半字(两个字节)。

同样,我知道如果您有一个地址A和一个大小为的对象s,则访问是对齐的if A mod s = 0。但是我只是不明白为什么这在硬件级别很重要。


阅读 338

收藏
2020-07-28

共1个答案

小编典典

硬件很复杂; 这是一个简化的解释。

典型的现代计算机可能具有32位数据总线。这意味着,CPU需要进行的任何取回操作都会取回特定存储器地址的所有32位。由于数据总线无法获取小于32位的任何内容,因此地址总线上甚至不使用最低的两个地址位,因此,就好像RAM被组织为32位
而不是8位 字节 的序列一样。

当CPU对单个字节进行访存时,总线上的读取周期将访存32位,然后CPU将丢弃其中的24位,将剩余的8位加载到任何寄存器中。如果CPU要获取
在32位边界上对齐的32位值,则有几种常规选择:

  • 在总线上执行两个单独的读取周期,以加载数据字的相应部分并重新组装它们
  • 通过丢弃地址的低两位来读取该地址处的32位字
  • 读取一些意外的组合成32位字的字节组合,可能不是您想要的字节组合
  • 抛出异常

我使用过的各种CPU都采用了所有这四个路径。通常,为了获得最大的兼容性,将所有n位读取对齐到n位边界是最安全的。但是,如果确定您的软件可以在某些特定的CPU系列上以已知的未对齐读取行为运行,那么您当然可以采用快捷方式。而且,即使可能进行未对齐的读取(例如在x86系列CPU上),读取速度也会变慢。

2020-07-28