使用函数返回非内置类型对象时总是担心因拷贝对象而带来的性能问题。
因此经常使用方式一传递对象的引用作为函数的参数,然后在函数里为对象赋值,而不使用方式二
方式一:
void f(std::vector<int>& v) {
// do some thing with v
}
方式二:
std::vector<int> f() {
std::vector<int> v;
// do some thing with v
return v;
}
但是第一种方式看起来总是不太直观,因此搜索返回值优化相关,发现了 copy elision
和 RVO
。
在 c++ 计算机编程中,copy elision
和 RVO (Return Value Optimization)
返回值优化,是一种编译器优化技术,可以消除函数返回时创建的临时对象,达到减少拷贝构造函数调用的操作。
class Object {
public:
Object() { std::cout << "Constructor\n"; }
~Object() { std::cout << "Destructor\n"; }
Object(const Object&) { std::cout << "Copy constructor\n"; }
};
Object f1() {
Object o;
return o;
}
int main() {
Object o1; // Constructor
Object o2(o1); // Copy constructor
Object o3 = f1(); // Constructor
Object o4; // Constructor
o4 = f1(); // Constructor
return 0;
}
大多数编译器都支持返回值优化。但在某些情况下,编译器可能无法执行优化。一种常见的情况是,函数可能根据条件返回不同的命名对象
Object f2(bool cond) {
Object first;
Object second;
return cond ? first : second;
}
Object o5 = f2(true); // Copy constructor
注: gcc 的 -fno-elide-constructors 编译选项会禁用 copy elision,通常不建议这么做。
C++11 rvalues and move semantics confusion (return statement)
wikipedia - Copy elision
https://en.cppreference.com/w/cpp/language/copy_elision
RVO和NRVO的区别是什么?