xor i,i
他告诉我,这比为它分配零要快。 这是真的吗? 编译器是否进行优化以使代码执行此类操作?
答案 0 :(得分:27)
答案 1 :(得分:5)
在较老的CPU上(但是那些在Pentium Pro之后的那些,根据评论)这曾经是这种情况,但是,现在大多数现代CPU都有特殊的热路径,用于零分配(寄存器和良好对齐的变量)产量相当的表现。大多数现代编译器都倾向于使用两者的混合,这取决于周围的代码(较旧的MSVC编译器总是在优化的构建中使用XOR
,并且它仍然使用XOR
相当多,但是在某些情况下也使用MOV reg,0
。
这是一个非常微观的优化,所以,除非你因为寄存器依赖性而导致紧密的循环,否则你可以做到最好的套件。但应注意,使用XOR
大部分时间占用的空间较少,这对于嵌入式设备或尝试对齐分支目标非常有用。
这假设你主要是指x86及其派生词,在那个注释中@Pascal给了我一个想法,就是为此提供技术参考。英特尔优化手册有两个部分,即2.1.3.1 Dependancy Breaking Idioms
和3.5.1.7 Clearing Registers and Dependancy Breaking Idioms
。这两个部分基本上提倡使用基于XOR
的指令进行任何形式的寄存器清除,因为它具有依赖性的中断性(可以消除延迟)。但是在条件代码需要保留的部分中,优先MOV
0进入寄存器。
答案 2 :(得分:0)
由于xor指令较短且预取队列占用内存带宽限制,因此8088(以及8086的较小程度)肯定是正确的。