我在网站上读到使用xor swaps很快,因为它不使用临时变量。这是一个例子:
#include <stdio.h>
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;
}
为什么人们不在实际代码中使用这种技术?这只是穷人的风格吗?有没有明确定义的东西?这是我的编译器可以自动从更清晰的代码生成的优化吗?
答案 0 :(得分:18)
因为可读性优于性能。
因为tmp = a; a = b; b = tmp;
不是
因为编译器无论如何都会优化它。
因为它仅适用于整数。如果要交换浮点数怎么办?字符串?自定义对象?等
答案 1 :(得分:5)
所有答案都已经存在,只考虑添加 -
- &gt;如果两个值都用于相同的内存地址 - 结果将为零
- &gt;编译器可以优化天真交换中的临时变量
- &gt;现代CPU努力通过指令流水线并行执行指令 但是使用XOR技术要比使用临时变量进行交换慢得多,因为每个操作都取决于之前的结果
- &gt; x + Y可以用于整数溢出
答案 2 :(得分:2)
虽然没有明确的临时变量,但在写入寄存器之前,结果实际上存储在隐式临时变量中。
使用xor swap,您需要确保被交换的变量不相同。否则,两者都应评估为0。
答案 3 :(得分:1)
性能增益通常很小,“可理解代码”的成本高于获得的速度效益。