我最近一直在研究右值参考,并得出结论,在任何地方使用pass-by-value进行完整的对象复制是非常有利的(为了完整的理由,请参阅例如如何在添加rvalue参考运算符时减少冗余代码重载?而要速度?按值传递!),因为编译器可以自动在如情况下优化复制走f(std::move(a));,其中f被定义为void f(A a);.
传递价值的一个负面后果是,std::move即使在简单的情况下,所有代码都会被弄乱,例如:
void Object::value(A a)
{
value_ = std::move(a);
}
Run Code Online (Sandbox Code Playgroud)
显然,如果我只写下面的内容:
void Object::value(A a)
{
value_ = a;
}
Run Code Online (Sandbox Code Playgroud)
a即使没有提示,编译器也应该很难识别出它的生命周期即将结束,并且不会使用额外的副本来惩罚我.事实上,即使在复杂的函数中,编译器也应该能够识别它.
问题:
C++ 0x标准是否允许此优化?
编译器是否使用它?即使在复杂的情况下,即函数由多行组成?
这种优化的可靠性如何,即我希望编译器能够像我期望编译器应用返回值优化那样使用它吗?
像这样的代码经常出现在r值引用文章中:
void g(X);
void f()
{
X b;
g(b); // still need the value of b
…
g( std::move(b) ); // all done with b now; grant permission to move
}
Run Code Online (Sandbox Code Playgroud)
编译器是否可以自动生成此优化,即检测l值是否会被破坏并且可能会被移除,或者这会违反标准,假设一般情况编译器不知道如何是移动,复制或破坏为X类实现?
如果允许这样的优化,它是否由某些编译器在实践中执行?