为什么一个天真的'iter_swap`电位比``swap''慢得多

Why is a naive `iter_swap`potentially much slower than `swap`?

本文关键字:swap 真的 天真 一个 iter 为什么      更新时间:2023-10-16

来自David Abrahams和Aleksey Gurtovoy的书" C 模板元编程",我了解到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);
}

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

您的iter_swap()通常是次优的,如果它完全可以使用,并且不是错误的。

  1. 使用参数依赖性 - lookup:
    有一个原因std::iter_swap()委托给swap()拾取量身定制的实现。

  2. 此外,缩进std::swap()交换时会利用移动 - 可能会消除您不使用的昂贵资源 - 付款。

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

向量的std::swap是一个恒定的复杂性操作。

复制向量的复杂性与向量的长度有关。

T tmp = *it1调用复制构造函数。*it1 = *it2*it2 = tmp调用复制分配操作员。