在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 静态单一赋值,您可以在其中分解程序,以便对基元的每次赋值都会创建一个全新的变量(带有元数据)。然后,您可以证明该变量的属性,并消除多余的属性。
归档时间: |
|
查看次数: |
481 次 |
最近记录: |