我了解访问内存以便对齐的含义,但是我不明白为什么这样做是必要的。例如,为什么我可以从一个地址访问一个字节,0x…1但不能从同一个地址访问一个半字(两个字节)。
0x…1
同样,我知道如果您有一个地址A和一个大小为的对象s,则访问是对齐的if A mod s = 0。但是我只是不明白为什么这在硬件级别很重要。
A
s
A mod s = 0
硬件很复杂; 这是一个简化的解释。
典型的现代计算机可能具有32位数据总线。这意味着,CPU需要进行的任何取回操作都会取回特定存储器地址的所有32位。由于数据总线无法获取小于32位的任何内容,因此地址总线上甚至不使用最低的两个地址位,因此,就好像RAM被组织为32位 字 而不是8位 字节 的序列一样。
当CPU对单个字节进行访存时,总线上的读取周期将访存32位,然后CPU将丢弃其中的24位,将剩余的8位加载到任何寄存器中。如果CPU要获取 未 在32位边界上对齐的32位值,则有几种常规选择:
我使用过的各种CPU都采用了所有这四个路径。通常,为了获得最大的兼容性,将所有n位读取对齐到n位边界是最安全的。但是,如果确定您的软件可以在某些特定的CPU系列上以已知的未对齐读取行为运行,那么您当然可以采用快捷方式。而且,即使可能进行未对齐的读取(例如在x86系列CPU上),读取速度也会变慢。