相关疑难解决方法(0)

当最后一次使用可移动对象时,编译器会自动使用移动语义吗?

我最近一直在研究右值参考,并得出结论,在任何地方使用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即使没有提示,编译器也应该很难识别出它的生命周期即将结束,并且不会使用额外的副本来惩罚我.事实上,即使在复杂的函数中,编译器也应该能够识别它.

问题:

  1. C++ 0x标准是否允许此优化?

  2. 编译器是否使用它?即使在复杂的情况下,即函数由多行组成?

  3. 这种优化的可靠性如何,即我希望编译器能够像我期望编译器应用返回值优化那样使用它吗?

c++ optimization rvalue-reference move-semantics c++11

22
推荐指数
1
解决办法
1585
查看次数

编译器可以自动生成std :: move以最后使用左值吗?

像这样的代码经常出现在r值引用文章中:

Dave Abrams:用Rvalue参考移动它

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类实现?

如果允许这样的优化,它是否由某些编译器在实践中执行?

c++ rvalue-reference c++11

12
推荐指数
2
解决办法
929
查看次数