IA-32 x86数据对齐

时间:2015-03-17 11:08:22

标签: x86 ia-32

我能找到的一切只是告诉我,我应该对齐,因为它可以更有效率,但我找不到为什么我应该在IA-32上做到这一点的问题。这是因为地址总线需要可被4整除的地址吗?或者因为RAM只能提供对齐的数据而不会造成性能损失?或?

http://www-inst.eecs.berkeley.edu/~cs164/sp05/ia32-refs/ia32-chapter-two.pdf

  

在ia32上,不需要数据对齐。一个程序   无论它们在哪里,它都能正常使用四字节整数   位于。例如,一个四字节整数可以位于   地址1,2,3,4。 但是,机器执行效率更高   例如,如果四个字节的整数位于四字节边界上,那么a   更好地选择四字节整数的起始地址是一个   地址是4的倍数。

1 个答案:

答案 0 :(得分:4)

这是与硬件相关的问题。通常RAM模块连接如下:

enter image description here

如果发生对齐访问,则同时选择模块1,2,3和4,因此可以在一个存储器读周期中读取32位。

如果发生未对齐访问,比如说2个字节关闭,则在第一个读取周期选择模块1,2,3和4,其中只有较高的2个字节(我们提取的数据的低2个字节)阅读(模块3和4);在下一个读周期模块中选择模块5,6,7和8,其中只读取较低的2个字节(我们提取的数据的高2个字节)。

RAM模块的更详细视图(简化为4位机器,容量为4个字)。

4-bit RAM

在此图中,很明显您只能选择一行触发器,因为解码器只会激活其中一条输出线,其他3个将保持为0。

请注意,如果访问未对齐的地址(即MIPS),某些体系结构会强制您通过抛出总线错误来对齐所有内存访问,而其他体系结构将执行获取所需数据(即x86)所需的多个读取周期,尽管当然这需要额外的硬件(通常是MMU)。