【发布时间】:2015-08-18 03:38:15
【问题描述】:
也就是说,当一个人利用 C++11 类型名 && 特性(如移动构造函数等)时,通常会在设计良好的 C++03 代码中获得多少性能改进?多久值得一次麻烦,在什么情况下?
编辑:
想象一个替代宇宙,其中使用关键字“returning”而不是右值引用 C++11 扩展 C++03,该关键字标记将由函数返回的局部变量。如果局部变量被标记为“返回”,则它被放置在返回值通常所在的堆栈部分中。想象一下,您可以像这样使用该关键字:
SomeClass foo()
{
returning SomeClass bar; // Created where return value usually resides.
// do something with bar
return bar; // No copy constructor is involved here.
}
我认为这种机制可以创建 make_unique 和右值引用一样,并且会减少混乱和潜在的陷阱。三规则将保持三规则,而不是变成五规则;不会混淆 && if rvalue ref 或universal ref;不需要 std::move 等。
我在这里错过了什么?
【问题讨论】:
-
您很快就被评为“过于宽泛”,但我认为这不应该阻止您的调查。也许选择几个重点案例并询问一些非常具体的问题?
-
测量。 Measure。测量。
-
这并不是说它使事情表现得更好,而是它使避免不必要的分配/复制/释放周期变得更加简洁和容易,从而(我们希望)产生更清晰的代码,更容易理解和维护。看看人们构建的一些 C++11 之前的怪物,以获得移动语义自然给你的东西。例如,比较
auto_ptr和unique_ptr。 -
右值引用的值是你设置的值,当然使用赋值运算符。
-
您在编辑中建议的替代宇宙被称为 RVO,并且已经被大多数体面的编译器实现。
标签: c++ c++11 language-lawyer move-semantics rvalue-reference