Warm tip: This article is reproduced from serverfault.com, please click

c++-std :: swap用于整数类型的速度有多快?

(c++ - How fast is std::swap for integer types?)

发布于 2013-08-17 09:52:38

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;
}

我的问题:

  1. 如今(在x86arm它是一种优化吗?
  2. C ++标准是否支持这种优化?
  3. 在野外是否有任何真正的STL实现std::swap专门针对整数?
Questioner
Sergey K.
Viewed
0
Peter Alexander 2013-08-17 18:05:34

在绝大多数情况下,异或交换不是最优化。

请参阅此Wiki条目

在大多数实际情况下,使用临时寄存器的普通交换算法更为有效。进行XOR交换的局限性情况包括:

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

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

另请注意,你XOR交换的实现已损坏。你需要首先检查x和y是否为别名。此检查肯定会使XOR交换速度变慢。

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

请注意,不管标准库实现了什么,如果XOR交换确实比普通交换快,那么优化编译器将进行窥视孔优化,以将其转换为XOR交换。这确实是让编译器为你选择的一种情况。