人们为什么不使用xor交换?

我在一个网站上读到使用xor swaps很快,因为它不使用临时变量。 这是一个例子:

#include  int main(void) { int a=234,b=789; b=b^a; a=b^a; b=b^a; printf("a=%d,b=%d",a,b); return 0; } 

人们为什么不在现实代码中使用这种技术? 这只是穷人的风格吗? 有没有明确界定的东西? 这是我的编译器可以自动生成更清晰代码的优化吗?

  1. 因为可读性优于性能。

  2. 因为tmp = a; a = b; b = tmp; tmp = a; a = b; b = tmp; 不是那么慢。

  3. 因为编译器无论如何都会优化它。

  4. 因为它仅适用于整数。 如果要交换浮点数怎么办? 字符串? 自定义对象? 等等

所有的答案已经在那里考虑它只是一个补充 –

– >如果两个值都用于相同的内存地址 – 结果将为零

– >编译器可以在天真交换中优化掉临时变量

– >现代CPU努力通过指令流水线并行执行指令但是使用XOR技术比使用临时变量进行交换慢得多,因为每个操作都取决于之前的结果

– > x + Y可能会出现整数溢出

  1. 虽然没有明确的临时变量,但结果实际上在写入寄存器之前存储在隐式临时变量中。

  2. 使用xor swap,您需要确保交换的变量不相同。 否则两者都应评估为0。

性能增益通常很小,“可理解代码”的成本高于获得的速度优势。