考虑一下测试代码:
#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/