c++ - 为什么交换 stl 容器很快,但移动它们却很慢?
问题描述
为什么 STL 容器不简单地使用交换实现移动?例如
template <...>
class mycontainer {
public:
mycontainer& operator= (mycontainer&& src) {
swap(*this, src);
return *this;
}
};
移动的重点不是要快吗?交换不是已经给我们了吗?
我认为 STL 容器的交换速度很快,因为它们使用 PImpl 或其他东西,但似乎它们没有。那怎么换得这么快?
解决方案
为什么 STL 容器不简单地使用交换实现移动?
交换(通常)比最佳实施的移动构造慢,或者充其量(很少)同样快。
交换 + 最终破坏(通常)比最佳实施的移动分配 + 最终破坏要慢,或者充其量(很少)同样快。
单独交换确实比移动赋值更快,因为元素的销毁被推迟了。但是 C++ 标准不允许容器的移动赋值运算符对元素的破坏进行延迟,因此您建议的移动分配不符合要求。此外,这些元素通常最终会被破坏,当这种情况发生时,你只会失去效率。
只要标准实现者以其他方式破坏元素,就可以使用交换。但是这样做并没有效率优势,如果他们不使用它,这可能是他们的原因。
PS泛型std::swap
——在没有成员时使用swap
——是通过执行三个动作来实现的。标准容器实现了一个swap
比通用交换更快的成员,但在包括最终销毁时仍然不如单次移动那么快。
推荐阅读
- php - 解决wordpress模板中重复的html
- c# - 从服务引用创建 WCF 客户端时 MessageSecurityOverHttpElement 中的 IndexOutOfRangeException
- sql - 根据 SQL 的顺序对表中的每个出现进行计数
- python - 从 Tensorflow 张量获取特定索引
- oracle - 调用存储过程的Oracle游标循环
- mongodb - 如何使用mongodb聚合划分数组内的元素
- regex - 使用 arrayformula 添加后缀,但想跳过空单元格
- graphql - 如何查询仅显示上周的帖子
- c# - win10如何配置使用ODBC驱动?
- sql - 如何用括号替换字符串的最后一位