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

Ral*_*zky 4 c++ swap future c++11

C ++标准库中的所有类都有成员交换函数,包括一些多态类,例如std::basic_ios<CharT>。模板类std::shared_future<T>显然是一个值类型,并且std::future<T>是仅移动值类型。是否有任何特定原因,它们不提供swap()成员函数?

Yak*_*ont 5

std::move支持C ++ 11 之前,成员交换是一项巨大的性能提升。例如,您可以通过这种方式将一个矢量移动到另一位置。它也用于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);
}
Run Code Online (Sandbox Code Playgroud)

基本上将与定制脚本一样快。

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

如果std::future基本上是a的包装std::unique_ptr< future_impl >,则以上内容将需要4个指针读取,3个指针写入和一个分支。内联1的优化编译器可以将其减少为2指针读取和2指针写入(例如,使用SSA 2),这是优化的.swap成员函数可以执行的操作。


1因此,它知道对的中间访问lhs并且rhs永不发生,因此,tmp一旦证明tmp为空并因此具有无操作者,就可以消除的存在。

2 静态单一赋值,您可以在其中分解程序,以便对基元的每次赋值都会创建一个全新的变量(带有元数据)。然后,您可以证明该变量的属性,并消除多余的属性。