理解单词对齐

Chr*_*lli 13 theory hardware algorithm computer-architecture

我理解访问内存意味着什么是对齐但我不明白为什么这是必要的.例如,为什么我可以从一个地址访问一个字节,0x…1但是我不能从同一个地址访问一个半字(两个字节).

同样,我理解如果你有一个地址A和一个大小的对象,s访问是对齐的A mod s = 0.但我只是不明白为什么这在硬件层面很重要.

Gre*_*ill 26

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

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

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

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

我使用的各种CPU已经采用了所有这四种路径.通常,为了最大限度地兼容,最安全的是将所有n位读取与n位边界对齐.但是,如果您确定您的软件将在具有已知未对齐读取行为的某个特定CPU系列上运行,则您当然可以使用快捷方式.即使可以进行未对齐的读取(例如在x86系列CPU上),它们也会变慢.

  • *地址总线上甚至不使用最低的两个地址位*如果是这样,那么如何仅用 30 位寻址 32 位地址?如果我错了,请纠正我。 (4认同)

Eta*_*tan 7

计算机总是读取一些固定大小的块,这些块是对齐的.

因此,如果您不将数据与内存对齐,则可能不得不多次阅读.

  • 字大小是8个字节
  • 你的结构也是8个字节
  • 如果你对齐它,你将不得不阅读一个块
  • 如果你不对齐它,你将不得不阅读两个块

所以,它基本上是为了加快速度.