为什么小于CPU字长的数据需要以其大小的倍数对齐?

qyswt5oh  于 2023-03-17  发布在  其他
关注(0)|答案(1)|浏览(117)

让我们假设一个32位CPU和2字节short。我知道4字节int需要在4的倍数地址对齐,以避免额外的读取。

问题:

1.如果一个short存储在0x1,CPU仍然可以在一次操作中从0x0读取,那么,为什么short需要在2的倍数的地址对齐呢?
1.如果短整型存储在0x2中,既然CPU只能从0x 0读取并丢弃前两个字节,为什么会认为它是对齐的和高效的呢?
有一个question与此非常相似,但是,答案只是告诉我们结构体和独立变量中的short的对齐要求是相同的。还有一个注解有2个赞成票,内容如下:
在许多机器上,当数量是N字节对齐时,访问N字节数量(至少对于{1,2,4,8,16}中的N)的工作效率最高。我习惯了它,因为我怀疑芯片制造商会改变它,只是因为你认为它不应该是这样的。
但是为什么呢?

bmp9r5qi

bmp9r5qi1#

大多数机器都设计有内存,该内存使用“字”地址和字节选择线的组合来寻址,“字”地址标识一组两个或多个字节,字节选择线指示正在访问一个字中的哪些字节。当执行一个字或更小的操作时,可以同时访问一个字中的所有字节。大于一个字的操作总是需要分成多个操作,并且大多数CPU不会关心任何大于字大小的块的对齐;一些CPU可能能够将需要访问两个连续字的部分的字大小或更小的操作分割成更小的操作,但是这种能力不是通用的。
该标准保证,对于2的任意次幂N,N的倍数的偏移量进入为N字节对象适当对齐的分配将产生为N字节对象适当对齐的地址。它不保证具有较小字长的平台将容忍较松散的对齐,因为:
1.标准特意放弃了对不可移植构造的管辖权。
1.想要提供更强保证的实现可以自由地这样做,而想要坚持C精神的编译器编写者将这样做,而没有任何理由不这样做。
1.即使在8位平台上,要求字对齐也可能有好处,尽管具有讽刺意味的是,我不知道在8位平台上有任何实现这样做过,在那里它会是最有用的。例如,在Z 80上,用一个地址在HL中的16位值加载DE的常见方法是:

mov e,(HL)
 inc hl
 mov d,(hl)

但如果HL已知为偶数,则第二条指令可以替换为inc l,这将快两个周期,将总时间从20个周期减少到18个周期。这不是一个巨大的性能优势,但如果应用程序从不使用奇数地址来存储字长值,则它将代表“唾手可得的果实”。

相关问题