C ++标准库中的所有类都有成员交换函数,包括一些多态类,如std::basic_ios<CharT>
。模板类std::shared_future<T>
显然是值类型,std::future<T>
是仅移动值类型。有什么特别的原因,他们没有提供swap()
成员函数吗?
答案 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 因此它知道.swap
和lhs
的中间访问权限永远不会发生,因此rhs
的存在可以被消除,如果它被证明的话tmp
是空的,因此有一个无操作的人。
2 Static single assignment,你打破一个程序,使每个基元的赋值创建一个全新的变量(带元数据)。然后,您可以证明该变量的属性,并消除多余的变量。