gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:01:41 25 4
gpt4 key购买 nike

从 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 倍,即使 vector 的大小(其元素都是小字符串,长度小于 10)仅为 10。

最佳答案

您的 iter_swap() 通常不是最优的,即使它“有效”,也不是完全错误的。

  1. 这是有原因的std::iter_swap()使用 委托(delegate)给 swap() :
    选择量身定制的实现。

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

当然,对于琐碎的类型,两者都是不相关的。

关于c++ - 为什么天真的 `iter_swap` 可能比 `swap` 慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54791753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com