考虑一下测试代码:

#include <iostream>
using namespace std;

class Klass
{
public:
  Klass()
  {
    cout << "Klass()" << endl;
  }

  Klass(const Klass& right)
  {
    cout << "Klass(const Klass& right)" << endl;
  }
};

Klass create(Klass a)
{
  cout << "create(Klass a)" << endl;
  return a;
}

int main()
{
  const Klass result = create(Klass());
}

编译:
g++ -O3 rvo.cpp   -o rvo

输出为:
$ ./rvo
Klass()
create(Klass a)
Klass(const Klass& right)

我期望编译器使用RVO机制来取消每个COPY CTOR调用,以避免复制返回值和函数create()的参数。为什么不这样呢?

最佳答案

您看到的副本是“创建”功能中“返回”语句的副本。 RVO无法消除它,因为不可能直接构造返回值。您要求“退回”。这里需要副本;没有对象就无法返回对象。

通常来说,[C++ 11:12.8 / 31]的条件不满足



出于某种原因,它不是一个任意规则,从实现的 Angular 来看很有意义,因为这是使用函数参数无法实现的:



您正在复制功能参数。您不能在没有内联的情况下删除此副本,因为在输入函数之前该参数已经存在,因此您不能直接将该对象构造为返回值。

关于c++ - 为什么g++在这里不启用RVO?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9293726/

10-11 17:52