【发布时间】:2013-08-19 16:38:36
【问题描述】:
STL 实现了一个通用的std::swap 函数来交换两个值。可以通过以下方式呈现:
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)? - C++ 标准是否支持这种优化?
- 是否有任何真正的 STL 实现具有
std::swap整数专用化?
【问题讨论】:
-
XOR 交换不一定有效 - 它比有用的优化更新颖 - 只需使用临时变量,保持简单并避免噱头 - 让编译器做聪明的事情。
-
如果 x 和 y 指向相同的内存地址,则第二个实现将不起作用(如果您传递具有可变索引的数组元素,则可能发生)。
-
智能编译器了解
std::swap在做什么,并且可以简单地注意到变量可以在不同的寄存器或地址中引用。这是一种有效的无成本交换。如果您查看生成的程序集,您可以看到这一点。 -
这里的重要教训:仅仅因为某些东西看起来很复杂和hackish并不自动意味着它更快。 :)
-
@Blastfurnace 这甚至不需要(总是)理解
std::swap的编译器,甚至不需要非常智能的编译器——不必要的寄存器移动通常会通过相当简单的窥视孔优化和寄存器调度来消除. (另一方面,XOR 技巧需要更智能的编译器来优化)。
标签: c++ performance c++11 stl swap