首页 > 解决方案 > 为什么交换 stl 容器很快,但移动它们却很慢?

问题描述

为什么 STL 容器不简单地使用交换实现移动?例如

template <...>
class mycontainer {
public:
  mycontainer& operator= (mycontainer&& src) {
    swap(*this, src);
    return *this;
  }
};

移动的重点不是要快吗?交换不是已经给我们了吗?

我认为 STL 容器的交换速度很快,因为它们使用 PImpl 或其他东西,但似乎它们没有。那怎么换得这么快?

标签: c++containersc++-standard-library

解决方案


为什么 STL 容器不简单地使用交换实现移动?

交换(通常)比最佳实施的移动构造慢,或者充其量(很少)同样快。

交换 + 最终破坏(通常)比最佳实施的移动分配 + 最终破坏要慢,或者充其量(很少)同样快。

单独交换确实比移动赋值更快,因为元素的销毁被推迟了。但是 C++ 标准不允许容器的移动赋值运算符对元素的破坏进行延迟,因此您建议的移动分配不符合要求。此外,这些元素通常最终会被破坏,当这种情况发生时,你只会失去效率。

只要标准实现者以其他方式破坏元素,就可以使用交换。但是这样做并没有效率优势,如果他们不使用它,这可能是他们的原因。


PS泛型std::swap——在没有成员时使用swap——是通过执行三个动作来实现的。标准容器实现了一个swap比通用交换更快的成员,但在包括最终销毁时仍然不如单次移动那么快。


推荐阅读