最有效的方法是不要自己尝试。
这真的取决于你为什么/想要这样做。试图聪明并用 C++ 编写晦涩难懂的代码只会降低编译器正确优化它的机会。
假设我们使用您编写的 ±-方式:
首先必须从内存中加载值 a 和 b。
然后你正在做 3 个算术运算来“交换”它们的内容。
最后,这两个值必须再次存储在内存中。
(不会使用实际的汇编代码,因为我不太熟悉它,而且这个伪汇编更容易理解这个概念)
load a into register rA
load b into register rB
add rB to rA and store in rA
subtract rB from rA and stor in rB
subtract rB from rA and store in rA
store register rA to memory b
store register rB to memory a
如果编译器会完全按照您的要求进行操作(很可能他会忽略它并使其变得更好),那就是:
2 个负载,3 个简单的数学函数,2 个存储 - 7 个操作。
它也可以做得稍微好一点,因为加法/减法可以用内存中的 1 个值来完成。
load 'a' into register rA
add b to rA and store in rA
subtract b from rA and store in rB
subtract rB from rA and store in rA
store rA to a
store rB to b
如果我们使用额外的 tmp 变量:
int a =..., b = ...;
int tmp = a;
a = b;
b = tmp;
编译器可能会认识到“tmp”只是一个临时变量,仅用于交换 2 个值,因此它不会为其分配内存位置 btu 仅使用寄存器。
在这种情况下,它会做的事情是:
load a into register rA
load b into register rB
store register rA to memory b
store register rB to memory a
只有 4 个操作 - 基本上是最快的,因为您需要加载 2 个值,并且您需要存储 2 个值,仅此而已。
(对于现代 nx86_64 处理器,没有命令可以只交换内存中的 2 个值 - 其他架构可能有它,并且在这种情况下更快)。
执行这些算术运算(或 xor-trick)是一种很好的练习,但在现代 x86 CPU 上,除了最基本的编译器之外,它不会以任何形式“更高效”。
它将使用相同数量的寄存器,相同数量的变量内存,但需要更多指令来完成相同的工作。
一般来说,除非您检查过您的代码、对其进行测试和基准测试并发现生成的程序集不如预期的那么好,否则您不应试图超越编译器。
但几乎从不需要达到那个级别来进行优化,您最好把时间花在看大局上。