我在一个网站上看到使用xor交换的速度很快,因为它不使用临时变量。这是一个例子:
#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;
}
为什么人们在现实生活的代码中不使用这种技术?只是可怜的风格?是否有一些定义不明确的东西?我的编译器可能会自动从更清晰的代码中产生优化吗?
使用tmp变量更快[[和在现代编译器和CPU中更易读]。 2x加载到寄存器中,然后2x存储回到原始位置。
或者如果一个或两个变量已经在寄存器中,则编译器可能会完全优化临时变量。如果在某种假设的机器上进行异或交换更快,那么当优化tmp = a; a = b; b = tmp;
时,一个好的编译器会为您使用它,因此您无需显式编写它。这就是为什么您使用C而不是在asm中手动编写的原因。此外,异或交换仅适用于整数。如果要交换浮点数怎么办?琴弦?自定义对象?等
->如果两个值都用于相同的内存地址,结果将为零
->编译器可以优化天真的交换中的临时变量
->现代CPU努力通过指令流水线并行执行指令但是使用XOR技术比使用临时变量进行交换要慢得多,因为每个操作都取决于上一个的结果
-> x + Y可能会发生整数溢出