为什么一个天真的'iter_swap`电位比``swap''慢得多
Why is a naive `iter_swap`potentially much slower than `swap`?
来自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()
通常是次优的,如果它完全可以使用,并且不是错误的。
-
使用参数依赖性 - lookup:
有一个原因std::iter_swap()
委托给swap()
拾取量身定制的实现。 -
此外,缩进
std::swap()
交换时会利用移动 - 可能会消除您不使用的昂贵资源 - 付款。
当然,两者都与琐碎的类型无关。
向量的std::swap
是一个恒定的复杂性操作。
复制向量的复杂性与向量的长度有关。
。 T tmp = *it1
调用复制构造函数。*it1 = *it2
和*it2 = tmp
调用复制分配操作员。
相关文章:
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 字节真的是最小可寻址单元吗
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 如何在 std::vector 中找到<bool>哪些索引是真的?
- std::string 的对象真的可以移动吗?
- 在这种情况下,我真的复制了字节还是复制了字符?
- int8_t和uint8_t真的是整数吗?它们有什么用?
- 真的没有来自 std::string_view 的 std::string 的显式构造函数吗?
- 查找不等式为真的次数时出现问题
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 我可以使用 std::vector::swap 来修改共享向量吗?
- 在为嵌套类定义行外友元时,我真的必须打破封装吗?
- 你如何理解"std: :forward is just syntactic sugar"?这是真的吗?
- "std::forward"和"std::move"真的不生成代码吗?
- Valgrind 在 std::string::swap 中报告 SIGILL
- VS 2017 和 2019 运行 c++ 真的很慢
- 为什么一个天真的'iter_swap`电位比``swap''慢得多