C++函数返回优化


C++函数返回优化

我们知道,函数运行结束后,函数内部的局部变量就会消失,当函数返回的对象的时候,会产生一个临时对象,这样会消耗很多的计算资源,写一段代码进行测试。

#include 
using namespace std;

class MyBuff {
 public:
  MyBuff() {
    cout << "MyBuff()" << endl;
  }
  MyBuff(const MyBuff& b) = delete;
  MyBuff& operator=(const MyBuff& b) = delete;
  ~MyBuff() {
    cout << "~MyBuff()" << endl;
  }

  MyBuff(MyBuff&& b) noexcept { cout << "move construct" << endl; }

  MyBuff& operator=(MyBuff&& b) noexcept {
    cout << "move assign " << endl;
    return *this;
  }

};

class bbuffer {
 public:
  bbuffer() {}
  void show() { cout << "sh bbuffer" << endl; }
  ~bbuffer() {}
};

MyBuff GetBuff() {
  MyBuff res;
  cout << &res << endl;
  bbuffer b_;
  b_.show();
  return res;
}
int main() {
  MyBuff b = GetBuff();
  cout << &b << endl;
}

执行结果如下:

MyBuff()
0x7ff7bb322258
show bbuffer
0x7ff7bb322258
~MyBuff()

是不是感觉和理解的不对,这时候好像并没有产生一个临时的对象,我们发现b和临时对象res的地址是一样的,并且res的析构是在整个程序结束的时候执行的,难道编译器进行了优化。

之后百度发现有一种优化叫做返回值优化机制,传送门,编译时候加入参数 -fno-elide-constructors优化。

从新执行代码结果如下

MyBuff()
0x7ff7b2e2a200
show bbuffer
move construct
~MyBuff()
move construct
~MyBuff()
0x7ff7b2e2a258
~MyBuff()

这时候

MyBuff()是在GetBuff()函数内部进行构造。

返回的时候生成临时变量,(函数的返回值为右值)触发一次移动构造,之后析构res.

之后临时变量用来构造main中的c,之后析构

函数执行完成,c被析构。

为什么没有调用移动赋值构造,传送门


文章作者: ZhongSY
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZhongSY !
评论
  目录