这种交换 2 个数字的方式比使用临时变量的方式好还是坏?

Is this way of swapping 2 numbers better or worse than the one that uses a temp variable?

假设a和b是两个整数。

    b+=a;
    a=b-a;
    b-=a;

这种交换形式比使用临时变量好还是坏?为什么?在某些特定的 cases/scenarios 中,一个比另一个更好吗?假设我在这里只谈论整数值交换。

你应该先说你使用的是什么语言。

总的来说,我认为可以肯定地说,从性能的角度来看,"in-place swap" 比使用临时交换更可取。

在 C 或 C++ 中,上面的方法不好,因为如果你导致整数溢出,你会得到未定义的行为。

在那些语言中,最好为此使用按位运算。基本观察是,如果 A 和 B 是位并且我们使用加法模 2,那么这是一个交换(伪代码):

a += b;
b += a;
a += b;
// Now A and B are swapped if they are numbers mod 2.

因此,在 C/C++ 中,您将在上述模式中使用按位异或,一次对所有相应的位执行此操作。

我相信就是这样实现了两个指针的标准交换实现。 (OTOH 这可能只是作为编译器优化发生)

它的好处是就地版本不会失败,而如果交换的对象太大,使用临时变量的版本可能会破坏堆栈。

如果 ab 是智能指针类型,则 XOR 交换也比简单的交换实现要好得多——创建临时智能指针可能会导致分配,调用用户定义的构造函数,有副作用,并可能抛出异常,这意味着交换不再是一个不会失败的 noexcept 函数。 XOR 交换避免了所有这些。

当然,你只使用两个变量的那个比在其中使用第三个变量要好,原因是对于临时变量,你必须初始化一个偏离当然的值 space 消耗和使程序具有不确定性,有时会使程序变慢 25%,其次,优秀的程序员使用较少数量的变量来使代码整洁干净,因为他们知道变量可能获得结果的流程和可能性,即使可能有变化编程环境,如果由于不断变化的编译环境而不确定结果的后果,那么在这种情况下,您可以使用第三个变量至少让事情走上正轨。

通常大型应用程序会进行大量变量初始化,其中会有数千或数十万行代码,因此最好以有限的方式进行初始化,以便使用更少的代码行在应用程序上获得良好的性能,从而覆盖变量优于创建新变量,这是一个很好的做法。