STL实现了一个通用std::swap
函数来交换2个值。可以通过以下方式显示:
template <class T> void swap (T& a, T& b)
{
T c(std::move(a));
a=std::move(b);
b=std::move(c);
}
但是,有一种XOR交换算法可以交换2个整数(http://en.wikipedia.org/wiki/XOR_swap_algorithm):
void swap_u( size_t& x, size_t& y )
{
x = x^y;
y = x^y;
x = x^y;
}
我的问题:
x86
或arm
)它是一种优化吗?std::swap
专门针对整数?在绝大多数情况下,异或交换不是最优化。
请参阅此Wiki条目。
在大多数实际情况下,使用临时寄存器的普通交换算法更为有效。进行XOR交换的局限性情况包括:
- 在指令集编码允许将XOR交换编码为较少字节的处理器上;
- 在寄存器压力高的区域中,它可能使寄存器分配器避免溢出寄存器。
- 在可用RAM非常有限的微控制器中。
由于这些情况很少见,因此大多数优化的编译器都不会生成XOR交换代码。
另请注意,你XOR交换的实现已损坏。你需要首先检查x和y是否为别名。此检查肯定会使XOR交换速度变慢。
我不知道任何使用XOR交换的标准库实现。
请注意,不管标准库实现了什么,如果XOR交换确实比普通交换快,那么优化编译器将进行窥视孔优化,以将其转换为XOR交换。这确实是让编译器为你选择的一种情况。
我们在这里学到了很好的一课:怪异的维基代码无法优化