假设a和b是两个整数。
b+=a;
a=b-a;
b-=a;
这种交换形式比使用临时变量更好还是更差?为什么?在某些特定案例/场景中,一个比另一个好吗?假设我在这里只说wrt整数值交换。
答案 0 :(得分:2)
你应该先说出你正在使用的语言。
总的来说,我认为可以安全地说"就地交换"从性能的角度来看,最好是使用临时交换。
在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 ++中,您将在上述模式中使用按位XOR,一次性对所有相应的位执行。
我相信这是怎样的,例如实现了两个指针的标准交换实现。 (OTOH,这可能只是作为编译器优化而发生)
它具有以下优点:就地版本不会失败,而使用临时变量的版本如果被交换的对象太大则可能会使堆栈失效。
如果a
和b
是智能指针类型,则XOR交换也明显优于天真交换实现 - 创建临时智能指针可能导致分配,调用用户定义的构造函数,有边效果,并可能抛出异常,这意味着交换不再是一个不失败的noexcept
函数。 XOR交换避免了所有这些。
答案 1 :(得分:-1)
当然,你只使用两个变量的那个比使用第三个变量更好,原因是对于临时变量,你必须初始化一个超出课程空间消耗的值,并使程序不确定并且有时候使得它慢了25%,其次,优秀的程序员使用较少的变量来使代码整洁干净,因为他们知道变量的流程和可能性,即使编程环境可能有变化,变量也可能得到,如果你由于不断变化的编译环境,我不确定结果会产生什么后果,因此在这种情况下你可以使用第三个变量来至少使事情顺利进行。
通常大型应用程序需要进行大量的变量初始化,其中会有数千或10万行代码,因此最好以有限的方式初始化,以便用较少的代码行在应用程序上获得良好的性能,因此覆盖变量是比创建一个新变量更好,这是一个很好的做法。