函数返回的局部对象的生命周期
本文探索,一个函数中返回的局部对象的生命周期是多少?
(省流版)探索结论:在C++11及以上,函数返回值的复制构造可能会被移动构造替代(即是否有返回值优化(RVO))。如果是复制构造,局部对象在被复制一份(一份在局部函数中被析构,复制的那一份会在返回后生命周期结束再被析构一次);如果是移动构造,就不会析构两次
一、之前的想法以及验证
之前一直认为是这样的,函数中创建的局部对象是会在函数结束时进行销毁的,如果要return这个局部对象,就得先去进行复制构造。但是这样的话总感觉太浪费资源了所以就有点不相信这个是对的。然后来到ubuntu18用g++(版本是7.5.0,支持C++14)编译验证。(看完全文,就知道这个想法在没有RVO时就是对的,有RVO就是错的)
#include <iostream>
#include <string>
using std::cout;
using std::string;
class Fox
{
string m_name;
public:
Fox(string name="nick"){
m_name = name;
}
void bark()
{
cout << "bark\n";
}
~Fox()
{
cout << m_name <<" aowu....\n";
}
};
Fox getFox()
{
Fox fox;
Fox fox2("nick2");
return fox;
}
int main()
{
Fox fox =