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