面试问题:哪一个执行得更快,if (flag==0)
or if (0==flag)
? Why?
我还没有看到任何正确答案(已经有一些了)警告:纳瓦兹确实指出了用户定义的陷阱。我很遗憾我仓促地对“最愚蠢的问题”投了赞成票,因为似乎很多人都没有得到正确的答案,并且它为关于编译器优化的良好讨论提供了空间:)
答案是:
What is flag
's type?
在这种情况下flag
实际上是一个用户定义的类型。那么这取决于哪个过载operator==
被选中。当然,它们不对称似乎很愚蠢,但这肯定是允许的,而且我已经看到了其他滥用行为。
If flag
是内置的,那么两者应该采用相同的速度。
来自维基百科文章 http://en.wikipedia.org/wiki/X86_instruction_listings on x86
,我敢打赌Jxx
的指示if
声明:也许是一个JNZ
(如果不为零则跳转)或类似的东西。
我怀疑编译器会错过如此明显的优化,即使优化已关闭。这就是此类事物的类型窥孔优化 http://en.wikipedia.org/wiki/Peephole_optimization是专为.
EDIT:再次出现,所以让我们添加一些程序集(LLVM 2.7 IR)
int regular(int c) {
if (c == 0) { return 0; }
return 1;
}
int yoda(int c) {
if (0 == c) { return 0; }
return 1;
}
define i32 @regular(i32 %c) nounwind readnone {
entry:
%not. = icmp ne i32 %c, 0 ; <i1> [#uses=1]
%.0 = zext i1 %not. to i32 ; <i32> [#uses=1]
ret i32 %.0
}
define i32 @yoda(i32 %c) nounwind readnone {
entry:
%not. = icmp ne i32 %c, 0 ; <i1> [#uses=1]
%.0 = zext i1 %not. to i32 ; <i32> [#uses=1]
ret i32 %.0
}
即使人们不知道如何阅读IR,我认为它是不言自明的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)