最有效的方法是不要自己尝试去做。
这真的取决于你为什么/在哪里想要这样做。试图聪明地在C++中编写晦涩的代码只会降低编译器正确优化的机会。
假设我们使用你写的±-方法:
首先,需要从内存中加载值a和b。
然后你进行三个算术操作来"交换"它们的内容。
最后,两个值必须再次存储在内存中。
(不会使用实际的汇编代码,因为我对此不熟悉,而这个伪汇编语言更容易理解概念)
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”只是用于交换两个值的临时变量,因此它不会分配内存位置,而只使用寄存器。
在这种情况下,它将执行以下操作:
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个值 - 其他体系结构可能具有此功能,并且在这种情况下速度更快)。
执行这些算术运算(或异或技巧)是一个不错的练习,但在现代x86 CPU上,除了最基本的编译器外,它不会以任何形式“更有效率”。
它将使用相同数量的寄存器,相同数量的变量内存,但需要更多指令来完成相同的工作。
通常情况下,您不应尝试超越编译器,除非您已经检查了代码,测试和基准测试,并发现生成的汇编代码不如可能的好。
但是,几乎永远不需要达到那个优化级别,您的时间最好花在考虑更大的画面上。
std::swap
。 - NathanOliver