其他分享
首页 > 其他分享> > c – 为什么g不能在这里启用RVO?

c – 为什么g不能在这里启用RVO?

作者:互联网

考虑一下TEST代码:

#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()的参数.为什么不是这样?

解决方法:

您看到的副本是“create”函数中“return”语句的副本.它不能被RVO消除,因为不可能直接构造返回值.你要求“退回”.这里需要一份副本;没有它就没有办法返回一个物体.

在标准说法中,不满足[C 11:12.8 / 31]的以下条件

in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object (other than a function or catch-clause parameter) with the same cv-unqualified type as the function return type, the copy/move operation can be omitted by constructing the automatic object directly into the function’s return value

至于原因,它不是一个任意的规则,从实现的角度来看是有意义的,因为这是函数参数不可能做到的:

constructing the automatic object directly into the function’s return value

您正在复制函数参数.如果没有内联,则不能忽略此副本,因为在您输入函数之前参数已经存在,因此您无法直接将该对象构造为返回值.

标签:rvo,c,g
来源: https://codeday.me/bug/20191001/1840028.html