1

我在一个网站上读到,使用异或交换速度很快,因为它不使用临时变量。这是一个例子:

#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

4 回答 4

22

对于现代编译器和 CPU,使用 tmp 变量既更快更易读。2x 加载到寄存器中,然后 2x 存储回原始位置。

或者,如果一个或两个变量已经在寄存器中,编译器可能会完全优化临时变量。如果 xor-swapping 在某些假设的机器上更快,那么一个好的编译器会在优化时为你使用它tmp = a; a = b; b = tmp; 所以你不需要显式地编写它。这就是为什么您使用 C,而不是在 asm 中手动编写的原因。

此外,xor-swap 仅适用于整数。如果你想交换浮点数怎么办?字符串?自定义对象?等等

于 2013-05-14T05:04:49.673 回答
6

所有答案都已经存在,认为它只是一个补充 -

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

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

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

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

于 2013-05-14T05:35:33.027 回答
3
  1. 虽然没有显式临时变量,但在写入寄存器之前,结果实际上存储在隐式临时变量中。

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

于 2013-05-14T05:10:46.530 回答
1

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

于 2013-05-14T05:04:58.633 回答