栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++函数返回优化

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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被析构。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/889865.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号