零分配与xor,第二个真的更快?

时间:2011-10-08 07:01:14

标签: assembly compilation

几年前,有人向我展示了以下命令,将变量归零。

xor i,i

他告诉我,这比为它分配零要快。 这是真的吗? 编译器是否进行优化以使代码执行此类操作?

3 个答案:

答案 0 :(得分:27)

答案 1 :(得分:5)

在较老的CPU上(但是那些在Pentium Pro之后的那些,根据评论)这曾经是这种情况,但是,现在大多数现代CPU都有特殊的热路径,用于零分配(寄存器和良好对齐的变量)产量相当的表现。大多数现代编译器都倾向于使用两者的混合,这取决于周围的代码(较旧的MSVC编译器总是在优化的构建中使用XOR,并且它仍然使用XOR相当多,但是在某些情况下也使用MOV reg,0

这是一个非常微观的优化,所以,除非你因为寄存器依赖性而导致紧密的循环,否则你可以做到最好的套件。但应注意,使用XOR大部分时间占用的空间较少,这对于嵌入式设备或尝试对齐分支目标非常有用。

这假设你主要是指x86及其派生词,在那个注释中@Pascal给了我一个想法,就是为此提供技术参考。英特尔优化手册有两个部分,即2.1.3.1 Dependancy Breaking Idioms3.5.1.7 Clearing Registers and Dependancy Breaking Idioms。这两个部分基本上提倡使用基于XOR的指令进行任何形式的寄存器清除,因为它具有依赖性的中断性(可以消除延迟)。但是在条件代码需要保留的部分中,优先MOV 0进入寄存器。

答案 2 :(得分:0)

由于xor指令较短且预取队列占用内存带宽限制,因此8088(以及8086的较小程度)肯定是正确的。