为什么人们不使用异或交换? [关闭]

问题描述 投票:1回答:4

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

为什么人们在现实生活的代码中不使用这种技术?只是可怜的风格?是否有一些定义不明确的东西?我的编译器可能会自动从更清晰的代码中产生优化吗​​?

c swap xor premature-optimization
4个回答
20
投票

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

或者如果一个或两个变量已经在寄存器中,则编译器可能会完全优化临时变量。如果在某种假设的机器上进行异或交换更快,那么当优化tmp = a; a = b; b = tmp;时,一个好的编译器会为您使用它,因此您无需显式编写它。这就是为什么您使用C而不是在asm中手动编写的原因。

此外,异或交换仅适用于整数。如果要交换浮点数怎么办?琴弦?自定义对象?等


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

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

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

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

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


3
投票
  1. 虽然没有显式的临时变量,但结果实际上在写入寄存器之前已存储在隐式的temp变量中。
  2. 对于xor swap,您需要确保被交换的变量不相同。否则两者都应评估为0。

1
投票
性能增益通常很小,以至于“可理解的代码”的成本高于获得的速度收益。
© www.soinside.com 2019 - 2024. All rights reserved.