理解单词对齐

时间:2009-10-18 07:38:05

标签: algorithm hardware theory computer-architecture

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

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

4 个答案:

答案 0 :(得分:26)

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

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

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

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

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

答案 1 :(得分:7)

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

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

示例

  • 字长为8字节
  • 您的结构也是8个字节
  • 如果您对齐它,则必须阅读一个块
  • 如果你没有对齐它,你将不得不阅读两个块

所以,它基本上是为了加速。

答案 2 :(得分:1)

所有对齐规则的原因是缓存行的各种宽度(指令缓存对Core2架构有16个字节行,而数据缓存有64个字节行L2的L1和128字节线。)

因此,如果要存储/加载穿过Cahce-Line Boundary的数据,则需要加载和存储两个Cache-line,这会影响性能。 所以你只是因为性能受到影响而不这样做,就这么简单。

答案 3 :(得分:0)

尝试阅读串口。数据是8位宽。 不错的硬件设计人员确保它位于单词的最低位字节。

如果你的C结构中的元素没有字对齐(从向后兼容性或保存内存说) 那么结构中任何字节的地址都不是字对齐的。