为什么天真的`iter_swap`可能比`swap`慢得多?

Lon*_*ong 3 c++ swap iterator metaprogramming c++11

从David Abrahams和Aleksey Gurtovoy的书"C++ Template Metaprogramming"中我了解到iter_swap(见下文)会比std::swap有时慢得多.虽然这本书有一些解释,但我并没有得到它,有人可以通过更多细节解释其背后的原因.

template <typename ForwardIt1>
void iter_swap(ForwardIt1 it1, ForwardIt1 it2){
  typedef typename std::iterator_traits<ForwardIt1>::value_type T;
  T tmp = *it1;
  *it1 = *it2;
  *it2 = tmp;
}

template <typename ForwardIt1>
void swap_wrapper(ForwardIt1 it1, ForwardIt1 it2){
  std::swap(*it1, *it2);
}
Run Code Online (Sandbox Code Playgroud)

通过应用它们std::list<std::vector<std::string>>::iterator,我发现第一个比第二个慢10倍,即使矢量的大小(其元素都是小字符串,长度小于10)仅为10.

Ded*_*tor 6

iter_swap()常常是次优的,如果"作品"的说法,而不是完全错误.

  1. std::iter_swap()委托swap()使用是有原因的:
    挑选定制的实现.

  2. 此外,回退std::swap()在交换时利用了移动语义,可能消除了您没有使用的昂贵的资源获取.

当然,两者都与琐碎的类型无关.

  • 你是对的,但问题是*为什么*它是次优的(你用移动语义暗示了这一点,但它如何影响OP的代码可能并不明显)。 (2认同)