我意识到这种差异可以忽略不计,但在尝试将无符号长整齐为零时更有效?
unsigned long x;
...
x=0;
--OR--
x^=x;
泰勒
答案 0 :(得分:30)
如果你要实现编译器,你会怎么做?实际上,你会为两者选择最快的实现。由于两者都相同,因此这两种方法的实现速度最快。
换句话说,任何编译器在公元前5000年之后发布。如果启用优化,则会为x = 0
和x ^= x
生成相同的汇编代码。这意味着它们同样快速。
这不仅适用于赋值/ xorring,也适用于multiplication以及其他算法。 表达您的意图并让编译器对其进行优化。编译器在优化方面比您更好,相信我。
换句话说,编写可读代码并使用x = 0;
。
哦顺便说一句,按位xorring一个未初始化的整数本身是未定义的行为,一个好的编译器应该优化整个事物。
答案 1 :(得分:11)
首先,如果没有为变量赋值,那么在技术上“未定义行为”除了为其赋值之外还要执行任何操作。
其次,对于XOR而言,它在过去15到20年间生产的处理器上不太可能更快,因为它需要额外的读取。它可能在很长一段时间内更快(由于是SHORTER CODE),但实际上,我相信即使这是错误的。
编辑:我应该指出,在现代处理器中对寄存器进行异或后,它可能仍然更快/更紧凑。但是如果我们假设我们不知道x
是否在寄存器中,那么我们也不应该让编译器更复杂地确定我们实际在做什么。
答案 2 :(得分:2)
为什么要推测编译器的作用?让我们试一试吧!
这是一些测试代码:
void fzero()
{
unsigned long x;
x = 0;
}
void fxor()
{
unsigned long x;
x ^= x;
}
int main()
{
fzero();
fxor();
}
现在让我们看看生成的机器代码:
; 10 : unsigned long x;
; 11 :
; 12 : x ^= x;
; 13 : }
00000 c2 00 00 ret 0
; 3 : unsigned long x;
; 4 :
; 5 : x = 0;
; 6 : }
00000 c2 00 00 ret 0
PUBLIC main
; Function compile flags: /Ogtpy
; COMDAT main
_TEXT SEGMENT
main PROC ; COMDAT
; 18 : fzero();
; 19 : fxor();
; 20 : }
00000 33 c0 xor eax, eax
00002 c3 ret 0
main ENDP
哦,看!它们同样快速,均为0 ns。