std :: swap对整数类型的速度有多快?

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)

我的问题:

  1. 现在是优化(开启x86还是arm)?
  2. C++标准是否支持这种优化?
  3. 是否有任何真正的STL实现在野外具有std::swap整数专业化?

Pet*_*der 32

在绝大多数情况下,XOR交换不是优化.

看到这个wiki条目.

在大多数实际情况中,使用临时寄存器的普通交换算法更有效.XOR交换可能有用的有限情况包括:

  • 在指令集编码允许XOR交换以较小字节数编码的处理器上;
  • 在具有高寄存器压力的区域中,它可以允许寄存器分配器避免溢出寄存器.
  • 在微控制器中,可用RAM非常有限.

由于这些情况很少见,因此大多数优化编译器都不会生成XOR交换代码.

另请注意,您的XOR交换实现已被破坏.您需要先检查x和y是否有别名.这种检查肯定会使XOR交换速度变慢.

我不知道任何使用XOR交换的标准库实现.

请注意,无论标准库实现什么,如果XOR交换真的比正常交换快,那么优化编译器会进行窥孔优化以将其转换为XOR交换.这真的是让编译器为你选择的情况.

  • 关于窥视孔优化的编辑+1. (7认同)
  • 我们在这里学到了一个很好的教训:**Freaky-tricky-wiki 代码不可能是一种优化** (2认同)

Pau*_*l R 6

XOR交换实际上只是一种噱头,在某些情况下可能会失败(例如,两个变量都是对同一对象的引用).

XOR交换也不是特别有效,因为它具有串行依赖性,因此它总是需要至少三个指令周期.使用与临时的简单交换具有较少的依赖性,允许在现代超标量CPU上进行一些并行 - 在某些CPU上甚至可以在一条指令中实现,但即使没有特殊指令,它也可以在两个周期内执行.