最有效的交换值c ++的方法

Mar*_*ade 4 c++ double int performance processing-efficiency

我想知道在操作方面,交换整数的方式最有效的是c ++,为什么?是这样的:

int a =..., b = ...;
a = a + b;
b = a - b;
a = a - b;
Run Code Online (Sandbox Code Playgroud)

比使用临时更有效?还有其他更有效的方法吗?(不要求其他方式交换整数),为什么它们会更有效率?

afz*_*lex 8

分配值总是比算术运算快。

std :: swap的C ++实现

template<typename T> void swap(T& t1, T& t2) {
    T temp = std::move(t1); // or T temp(std::move(t1));
    t1 = std::move(t2);
    t2 = std::move(temp);
}
Run Code Online (Sandbox Code Playgroud)

因此,使用临时变量胜于算术技巧。
使用std :: swap甚至更好,因为重新发明编程轮子从来都不是一个好主意


Bat*_*eba 7

最好的方法是信任您的编译器使用C++标准库函数.它们是为彼此设计的.

std::swap 会胜利的.

你可以使用XOR交换int(它不需要临时的),但是现在它的表现仍然不如std::swap.

  • 我想补充一点,它的性能不如“std::swap”,因为“std::swap”可能在某些体系结构上使用单个机器指令进行交换。 (2认同)
  • 如果您不小心尝试与自身交换值,那么XOR交换将失败。 (2认同)

Tho*_*as. 5

就我而言,std::swap比以下慢 5%(均采用 O3 优化)。一般来说, std::swap() 函数调用复制构造函数,它可能总是比复制部分内存慢。

#include <cstring>

size_t objectSize = sizeof(Object);
char temp[objectSize];

loop {
    loop {
        memcpy(temp, a, objectSize);
        memcpy(a, b, objectSize);
        memcpy(b, temp, objectSize);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:使用堆栈而不是堆内存分配。