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

时间:2013-05-14 05:02:34

标签: c swap xor premature-optimization

我在网站上读到使用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;
}

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

4 个答案:

答案 0 :(得分:18)

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

  2. 因为tmp = a; a = b; b = tmp;不是

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

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

答案 1 :(得分:5)

所有答案都已经存在,只考虑添加 -

- &gt;如果两个值都用于相同的内存地址 - 结果将为零

- &gt;编译器可以优化天真交换中的临时变量

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

- &gt; x + Y可以用于整数溢出

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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