C++函数返回优化

本文通过实例探讨了C++中的返回值优化(Return Value Optimization,RVO)现象,展示了在返回对象时编译器如何进行优化,避免了临时对象的创建和拷贝,从而提高效率。通过禁用特定优化,观察到移动构造和析构的调用过程,揭示了编译器在优化中如何处理函数返回的对象。
摘要由CSDN通过智能技术生成

C++函数返回优化

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值