Ser*_* K. 20 c++ performance swap stl c++11
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);
}
Run Code Online (Sandbox Code Playgroud)
但是,有一个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;
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
x86
还是arm
)?std::swap
整数专业化?Pet*_*der 32
在绝大多数情况下,XOR交换不是优化.
看到这个wiki条目.
在大多数实际情况中,使用临时寄存器的普通交换算法更有效.XOR交换可能有用的有限情况包括:
- 在指令集编码允许XOR交换以较小字节数编码的处理器上;
- 在具有高寄存器压力的区域中,它可以允许寄存器分配器避免溢出寄存器.
- 在微控制器中,可用RAM非常有限.
由于这些情况很少见,因此大多数优化编译器都不会生成XOR交换代码.
另请注意,您的XOR交换实现已被破坏.您需要先检查x和y是否有别名.这种检查肯定会使XOR交换速度变慢.
我不知道任何使用XOR交换的标准库实现.
请注意,无论标准库实现什么,如果XOR交换真的比正常交换快,那么优化编译器会进行窥孔优化以将其转换为XOR交换.这真的是让编译器为你选择的情况.
XOR交换实际上只是一种噱头,在某些情况下可能会失败(例如,两个变量都是对同一对象的引用).
XOR交换也不是特别有效,因为它具有串行依赖性,因此它总是需要至少三个指令周期.使用与临时的简单交换具有较少的依赖性,允许在现代超标量CPU上进行一些并行 - 在某些CPU上甚至可以在一条指令中实现,但即使没有特殊指令,它也可以在两个周期内执行.
归档时间: |
|
查看次数: |
3100 次 |
最近记录: |