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

aut*_*tic 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

小智 20

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

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

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

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

  • @xaxxon据我所知,`^`只能对整数类型进行操作,`floatA&floatB`是一个编译器错误,因此你必须做类似`*(int*)&floatA ^*(int*)&floatB的操作`,打破了[严格别名规则](http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule). (2认同)

Day*_*rai 6

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

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

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

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

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