假设我有2个变量。
x = 1
y = 2
最终结果应为:
x = 2
y = 1
我想到了以下方法:
temp = x // clone x
x = y
y = temp
或(XOR交换)
x = x XOR y
y = x XOR y
x = y XOR x
我想得到关于低级别记忆等的答案......
最快的方法是什么?
注意:
我想得到一个额外的答案,假设没有副作用(代码,cpu),这是最快的,还是有其他更快的?
答案 0 :(得分:6)
问题是现代CPU架构不会让你得到这个答案。它们会隐藏许多效果并会暴露许多非常微妙的效果。
如果你有CPU寄存器中的值并且你有一个备用寄存器,那么temp
方式可能是最快的方式,也可能是消耗最少功率的方式。
使用XOR或+/-(非常简洁!)方法适用于您无法承担额外位置(额外内存变量或额外寄存器)的情况。这可能看起来很奇怪,但在C预处理器宏中,不能(轻松地)声明新变量,例如。
当变量在内存中时,所有变体在任何高性能CPU上的行为都很可能相同。即使编译器没有优化代码,CPU也会避免几乎所有的存储器访问,并使它们像寄存器访问一样快。
总的来说,我倾向于说:不要担心速度。在这个级别进行优化并不重要。尽量避免交换,这将是最快的!
答案 1 :(得分:4)
http://en.wikipedia.org/wiki/XOR_swap_algorithm
大多数现代编译器都可以优化掉临时变量 天真的交换,在这种情况下,天真的交换使用相同的数量 存储器和与XOR交换相同数量的寄存器并且处于 最快,通常更快。 XOR交换也少得多 任何不熟悉的人都可读并且完全不透明 技术。在现代CPU架构中,XOR技术是 比使用临时变量进行交换要慢得多。 一个原因是现代CPU努力执行指令 并行通过指令管道。在XOR技术中,输入 每个操作取决于前一个操作的结果,所以 它们必须按严格的顺序执行。
另见这个问题:
How fast is std::swap for integer types?
重要的是要注意,XOR交换要求您首先检查两个变量是否不引用相同的内存位置。如果他们这样做了,你最终会把它设置为零。
答案 2 :(得分:1)
XOR交换并不总是最有效的,因为大多数现代CPU架构都尝试并行化指令,但在XOR交换中,每一行都依赖于先前的结果(不可并行化)。对于临时变量交换,大多数编译器都会优化临时变量,最终会以天真的方式运行得更快或更快以及使用相同数量的内存。
另一种交换方式是:
x = x + y
y = x - y
x = x - y
类似地,XOR交换的效率和速度的论据也适用于此。
编辑:正如斧头所说,如果不仔细做,(+/-)方法也会导致溢出