我理解访问内存意味着什么是对齐但我不明白为什么这是必要的。例如,为什么我可以从地址0x…1
访问单个字节,但我无法从同一地址访问半个字(两个字节)。
同样,我了解如果您有一个地址A
和一个大小为s
的对象,则A mod s = 0
的访问权限会对齐。但我只是不明白为什么这在硬件层面很重要。
答案 0 :(得分:26)
硬件很复杂;这是一个简化的解释。
典型的现代计算机可能具有32位数据总线。这意味着CPU需要执行的任何提取都将获取特定内存地址的所有32位。由于数据总线无法获取小于32位的任何数据,因此在地址总线上甚至不使用最低的两个地址位,因此就好像RAM被组织成一个32位字的序列而不是8位字节。
当CPU对单个字节进行读取时,总线上的读取周期将取32位,然后CPU将丢弃其中的24位,将剩余的8位加载到任何寄存器中。如果CPU想要获取32位边界上未对齐的32位值,则它有几种常规选择:
我使用的各种CPU已经采用了所有这四种路径。通常,为了最大限度地兼容,最安全的是将所有n位读取与n位边界对齐。但是,如果您确定您的软件将在具有已知未对齐读取行为的某个特定CPU系列上运行,则您当然可以使用快捷方式。即使可以进行未对齐的读取(例如在x86系列CPU上),它们也会变慢。
答案 1 :(得分:7)
计算机总是读取一些固定大小的块,这些块是对齐的。
因此,如果您不将数据与内存对齐,则可能不得不多次阅读。
示例强>
所以,它基本上是为了加速。
答案 2 :(得分:1)
所有对齐规则的原因是缓存行的各种宽度(指令缓存对Core2架构有16个字节行,而数据缓存有64个字节行L2的L1和128字节线。)
因此,如果要存储/加载穿过Cahce-Line Boundary的数据,则需要加载和存储两个Cache-line,这会影响性能。 所以你只是因为性能受到影响而不这样做,就这么简单。
答案 3 :(得分:0)
尝试阅读串口。数据是8位宽。 不错的硬件设计人员确保它位于单词的最低位字节。
如果你的C结构中的元素没有字对齐(从向后兼容性或保存内存说) 那么结构中任何字节的地址都不是字对齐的。