为什么std :: future <t>和std :: shared_future <t>不提供成员swap()?

时间:2016-11-10 08:39:42

标签: c++ c++11 future swap

C ++标准库中的所有类都有成员交换函数,包括一些多态类,如std::basic_ios<CharT>。模板类std::shared_future<T>显然是值类型,std::future<T>是仅移动值类型。有什么特别的原因,他们没有提供swap()成员函数吗?

1 个答案:

答案 0 :(得分:4)

在C ++ 11中std::move支持之前,成员交换是一次巨大的性能提升。例如,这是你可以将一个矢量移动到另一个点的方式。它也用于vector调整大小,这意味着插入向量载体并不是完全的性能自杀。

std::move到达C ++ 11之后,许多有时为空的类型是std::swap的默认实现:

template<class T>
void swap( T& lhs, T& rhs ) {
  auto tmp = std::move(rhs);
  rhs = std::move(lhs);
  lhs = std::move(tmp);
}

基本上和定制书一样快。

swap成员的现有类型不太可能失去它们(至少立即失去)。但是,扩展新类型的API应该是合理的。

如果std::future基本上是std::unique_ptr< future_impl >的包装器,那么上面将需要4个指针读取,3个指针写入和一个分支。并且优化编译器将其内联到 1 可以将其减少到2个指针读取和2个指针写入(例如使用SSA 2 ),这是优化的{{1成员函数可以做。

1 因此它知道.swaplhs的中间访问权限永远不会发生,因此rhs的存在可以被消除,如果它被证明的话tmp是空的,因此有一个无操作的人。

2 Static single assignment,你打破一个程序,使每个基元的赋值创建一个全新的变量(带元数据)。然后,您可以证明该变量的属性,并消除多余的变量。