C++函数返回优化

C++返回值优化:提高函数返回值效率的方法 在C++编程中,函数的返回值往往是一个非常重要的部分,需要进行优化以提高程序的运行效率和性能。在C++编程中,函数的返回值往往是一个非常重要的部分,因为它往往会涉及到程序的运行效率和性能。在下面的代码示例中,我们将介绍这些技术的具体实现方法。它的实现方式非常简单,只需将函数的返回值类型定义为所需变量的引用即可。它的实现方式与返回引用基本相同,只需将函数的返回值类型定义为所需变量的指针即可。函数并将其返回的对象转移给另一个字符串类型的变量,从而取得了其返回值,并在后面的输出语句中打印了该值。 阅读详情

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

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

告别Mac自带终端:iTerm2 + Oh My Zsh 保姆级配置指南(含国内镜像源) 本文提供了一份详细的Mac终端优化指南,涵盖iTerm2、Oh My Zsh和Homebrew的配置流程,特别针对国内用户提供镜像源解决方案。通过安装现代化工具链和优化配置,帮助开发者打造高效、美观的终端工作环境,提升日常开发效率。 阅读详情

相关推荐

Isaac Sim 使用经验(配置要求,云服务器)

Google Colab及AutoDL都是在docker内运行,其中google colab并不支持docker指令,而依照AutoDL的相关文档,AutoDL并不直接提供docker指令。2. Google Colab/AutoDL 不支持图形化界面,图形渲染等任务,所以没有办法使用Omniverse Streaming进行直播,从而更好的对结果进行展示。对于第一点,或许存在直接手动复现镜像的可能,但是考虑到Isaac Sim/Isaac Lab由于比较新,可能不够稳定,因此还是按照官方文档进行部署。

weixin_44211433的博客 4589

C++ 返回值优化RVO

C++的返回值优化(Return Value Optimization,也被称为RVO)是一个重要的优化技术,可以提高程序的性能。返回值优化(RVO)是指编译器对临时变量的处理机制。对于函数返回一个对象的情况,编译器在生成代码时会按照以下规则进行优化:1.如果返回值是一个非静态局部变量,并且该变量是通过复制返回(Return by Value)方式返回的,编译器会尝试将该返回值直接构造在调用方的返回值处,而不是返回一个副本。

线上幽灵 1986

Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包

联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装。 工作的电脑不能上外网,所以不能通过直接输入pip命令来安装。 环境:电脑上已经安装了Python(没有安装的请参考其他教程)。 Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包的步骤如下: ...

dayou7738的博客 4943

C++函数返回值优化(RVO)

文章目录一 函数返回值优化的引出1. 对象的初始化2. 代码实际输出和理论输出二 返回值优化(RVO)1. 优化方法一2. 优化方法二三 如何关闭函数返回值优化 一 函数返回值优化的引出    在说C++函数返回值之前我们来看这样一份代码,代码如下: class A { public : A() { cout << "constructor" << endl; } A(const A &obj) { cout <

DRZ_2000的博客 1596

N32串口DMA接收不定长数据:空闲中断与DMA通道的协同处理

本文详细解析了在N32系列MCU中,利用串口空闲中断与DMA通道协同处理不定长数据的核心机制与实战方法。通过剖析空闲中断的触发时机、DMA的配置要点以及两者协同工作的关键时序,提供了避免数据错乱的避坑指南和完整的代码实现,旨在帮助开发者构建高效、可靠的嵌入式串口通信子系统。

weixin_29191669的博客 124

汇川AM系列PLC玩转CNC:手把手教你用File模式读取G代码文件(附避坑指南)

本文详细介绍了如何使用汇川AM系列PLC的File模式读取G代码文件,涵盖从CAD设计到PLC配置的全流程。特别针对路径格式、文件类型等常见问题提供避坑指南,帮助工程师快速实现CNC加工的自动化控制。

weixin_33582311的博客 408

C++的返回值优化(RVO,Return Value Optimization)

前言 大家都知道“过早的优化是万恶之源”这句话,然而我相信其中的大多数人都不知道自己是不是在做过早的优化。我也无法准确的定义什么叫做“过早的优化”,但我相信这“过早的优化”要么是得不偿失的,要么干脆是有害无利的。今天我就想举个我认为是“过早的优化”的例子。 从函数返回值 为了从一个函数得到运行结果,常规的途径有两个:通过返回值和通过传入函数的引用或指针(当然还可以通过全局变量或成员变量,但我觉得这...

imred的专栏 1万+

9、双玩家博弈中的精确与近似纳什均衡及中国股市再融资偏好研究

本文研究了双玩家博弈中精确与近似纳什均衡的计算方法,提出通过线性松弛问题LR在多项式时间内求解正则双矩阵博弈的纳什均衡,并分析其在α-平滑博弈中的近似性能。同时,探讨了中国股市2001-2009年期间再融资偏好的动态变化,重点考察非流通股改革对再融资方式选择的影响。研究表明,改革前配股为主导,改革后公开发行(含定向增发)因溢价发行和低参与门槛成为主流,显著提升了资金募集效率和市场参与度。结合博弈论模型与实证分析,揭示了制度变革对企业融资行为的深远影响。

nn3456的博客 82

移动构造函数

#include<iostream> #include<vector> #include<string> using namespace std; class Test { public: Test(const string& s = "hello world") :str(new string(s)) { cou...

weixin_30892763的博客 4245

推荐系统(一)概述

在互联网领域,推荐系统(Recommendation Systems)的应用非常广泛。在音视频方面,如抖音、快手、哔哩等;在电商平台方面,如京东、淘宝、拼多多等。推荐有助于帮助用户快速发现潜在感兴趣的内容(音视频、商品、新闻等信息流),从而提升用户体验,同时有助于提升商业效率。从本文开始,笔者将结合自身在信息流推荐领域的经验,通过系列文章对推荐系统展开介绍。

Jin_Kwok的博客 6085

第1章 环境准备

本章是 Kubernetes 高可用集群部署的前置基础环境配置,所有节点必须严格按顺序执行。主要内容包括:节点规划(IP、角色、配置要求)、VMware 克隆节点环境清理(解决 MAC 地址和主机名冲突)、统一工作目录创建、主机名与 hosts 解析配置、系统基础升级、防火墙与 swap 关闭、内核模块加载(overlay、br_netfilter、ip_vs)、网络参数优化(IP 转发、桥接过滤)、时间同步配置等。Ubuntu 24.04 内核 6.8+ 原生支持 eBPF 和 IPVS,无需手动升级内核

幸福街--linux技术分享 210

C11-noexcept超简单范例

SHOW_SMALL_FUNCTION_BLOCK_TIPS("noexcept") { //关键字跟在函数后面,意思是不抛出异常 //正常情况下,vector如果在你自定义类对象增加时自增长,那么调用你的默认拷贝构造函数。 //如果你要进行优化在vextor的自增长时使用右值引用(移动)的构造函数 //那你就需要写一个这个函数,这个函数优先级比较高,会优先调用 //vector成长时会调用 class Test { int a = 0; int b = 0;.

MorningStar的博客 332

uniapp | vue2 | vue3 - 解决调用天地图功能服务时 http 网络请求报错 net::ERR ABORTED 503(Service Temporarily Unavailabl)

vue,uni-app,天地图,请求报错,503,请求失败,map.tianditu,天地图503,天地图请求503,接口503错误怎么办,vue天地图,uniAPP天地图,获取定位接口服务器报错503,获取当前定位,定位功能,IP属地定位,天地图服务器报错,如何解决报错,net::ERRABORTED503(ServiceTemporarilyUnavailabl),GET,POST,服务暂时不可用,react天地图,一直等待吗,报错怎么办,定位报错,轨迹,经纬度,天地图服务器503,在vue2

🏆 前端领域优质创作者 4438

C++ 函数返回值优化

如果编译器支持返回值优化(RVO,Return Value Optimization)或者具名返回值优化(NRVO,Named Return Value Optimization),那么在返回。对于上面的例子,通过返回值优化(RVO)或具名返回值优化(NRVO),编译器可以省略掉。的资源(如动态分配的内存)可以被移动而不是复制,那么编译器会调用移动构造函数来将。如果没有应用RVO/NRVO,但编译器支持移动语义(C++11及以后版本),),在这种情况下,编译器可能会优化掉不必要的拷贝。

weixin_51883798的博客 920

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

关于C++函数返回值的拷贝优化问题

在传统C++程序中,如果函数的返回值是一个对象的话,可能需要对函数中的局部对象进行拷贝。如果该对象很大的话,则程序的效率会降低。在C++ 11以后,出现的移动语义(Move Semantic)及拷贝优化(Copy Elision)都是解决这个问题的方法。本文试图以一个最简单的例子来说明这个问题。

给永远比拿愉快 1054

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【C++ 函数 基础教程 第四篇】深入C++函数返回值:理解并优化其性能

在我们开始深入探讨C++函数返回值的机制之前,让我们首先理解一下什么是函数返回值。函数返回值(Function Return Value)是函数执行完毕后返回给调用者的结果。这个结果可以是任何类型,包括基本类型(如int,double等),对象,甚至是引用或指针。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 741

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RVO C++函数返回值复制优化

来源:https://sigcpp.github.io/2020/06/08/return-value-optimization。可以通过传入引用的方式/指针用法 避免RVO失去优势。

switch_JR的博客 438

C++中拷贝构造函数的调用及返回值优化问题

关闭返回值优化: C++中临时对象及返回值优化: 关闭返回值优化以后执行以下函数: #include <iostream> #include <string.h> class student { public: // 普通构造函数 student(int i, char* c, int a, float s) { std::cout &...

qq_14950689的博客 538

C++函数参数传递与返回值优化技巧

很久没登陆优快云,最后一次发帖是换工作的散分贴,之后背井离乡,一去就是八年。八年前的自己对技术充满热情,但是有些井底之蛙,也有些偏激。八年过去,恍然大悟,技术无论大小,总应该有些积累,有些沉淀,有些能让自己和后来之人收益之处,于是乎开始着手写技术文章,文章或许浅显,但或多或少可以与君交流提高。废话那么多,那么第一章就说点简单的吧。       C++函数的数据传递,这里主要指参数传递与返回值。

编码十年 846

以历史角度看优化 -- C++历程对于函数返回值的优化

C++返回值优化核心总结: NRVO(具名返回值优化):初始化+返回具名对象=0拷贝0移动,直接构造 RVO(匿名返回值优化):初始化+返回匿名对象=0拷贝0移动,最优方案 NRVO失效情况:先定义后赋值=1次移动构造+1次移动赋值 强制关闭优化:保留移动语义时=2次轻量移动 C++98优化:1次深拷贝 C++98不优化:2次深拷贝(最慢) 关键记忆点:初始化写法配合单一返回路径可获得最优性能,移动语义比拷贝快,C++11优化机制显著提升效率。

BinaryWiker的博客 366

C++ return时不调用拷贝构造函数 返回值优化

C++函数在return一个局部对象的时候,会调用复制构造构造,生成一个临时对象。 例如 MyClass Fun() { MyClass tmp return tmp; } 函数Fun在return tmp理应会调用MyClass的拷贝构造函数。 但是如下代码用g++编译后运行,并没有调用到复制构造函数。 #include <iostream> using namespace s...

我的博客 3226

C++构造函数传参与返回值时的优化

总结C++对传参和传返回值时构造的优化处理 这里用具体例子说明,简单定义一个日期类: class Date { public: Date(int year = 0, int month = 0, int day = 0) :_year(year) , _month(month) , _day(day) { co...

Guijun6的博客 1223

C++高级面试题:请解释 C++ 中的函数返回值优化(Return Value Optimization)

但是,如果编译器执行了函数返回值优化,那么拷贝构造函数可能不会被调用,而是直接在 main 函数中构造 obj 对象,从而避免了额外的拷贝操作。但是,由于返回值优化的存在,编译器可以优化掉这些临时对象的创建和拷贝,直接将结果构造在调用者的栈空间中。函数返回值优化的核心思想是利用函数栈帧(stack frame)来存储返回值对象,而不是在调用者栈帧中创建一个临时对象,然后通过拷贝或移动构造函数将其复制到调用者栈帧中。但是,通过函数返回值优化,编译器可以避免创建副本,直接在调用者的栈空间中构造返回值对象。

qiuyehuanghun的博客 809

C++代码优化(2)函数设计与返回值优化

最近在看《提高C++性能的编程技术》,看到返回值优化这一章的时候顺便温习一下《高质量C++编程指南》相应的章节。 (1)函数设计         1、参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用void填充。 void SetValue(int width, int height); // 良好的风格 void SetValue(int, int);

1671

C++函数返回对象机制:从拷贝构造到移动语义的性能优化

在C++编程中,函数返回对象是一个基础但关键的操作,它直接关系到程序的性能和资源管理。从语言标准层面,当函数按值返回一个类对象时,会触发拷贝构造函数来创建临时对象,这可能导致不必要的性能开销,尤其是在对象包含动态分配内存等资源时。为了优化这一过程,C++引入了返回值优化(RVO)和命名返回值优化(NRVO),允许编译器在某些情况下直接构造目标对象,从而省略拷贝。随着C++11及后续标准的演进,移动语义通过右值引用和移动构造函数,从语言层面提供了更高效的资源转移方式,将昂贵的深拷贝转换为廉价的指针交换。这些技

weixin_30378623的博客 340

[c++11] 删除(delete)的函数为什么会参与重载决议:函数返回值优化Return value optimization

删除移动构造函数 c++11编译报错,说引用了deleted的函数 使用c++17编译是通过的,运行良好 c++20也是错的,报错同上 open-std关于delete的说法 上面的运行结果,为什么只调用了构造函数,一次拷贝也没有调用呢? 因为c++进行了函数返回值的优化RVO 函数返回值优化(RVO,Return value optimization) 这样就行了两次拷贝,其中那个临时的对象是没有用的 其实现在的编译器做的是直接将obj的引用传进去了,在里面直接将返回值构造在obj处

DUT_LYH 674
上一篇: 水塘抽样(解决k个数据均匀抽样问题)
下一篇: 大小端详解
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值