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

embedded/2024/10/17 8:13:32/

来源:https://sigcpp.github.io/2020/06/08/return-value-optimization

简单总结:
函数返回值一般可以触发返回值复制优化,但是有下面几个条件:

  1. 语言支持。目前 GCC 和 MSVC 都默认执行 URVO,并且无法禁用它,因为 C++17 保证在返回临时对象时进行复制省略。
  2. 在接受函数返回值的语句是一个初始化语句(这样RVO才能发挥优势)
/// 触发
S get_name()
{S s1;return s1;
}S get_uname()
{return S();
}S s = get_name(); /// 触发RVO
S s1 = get_uname(); /// 触发RVO
/// 不触发
S get_name()
{S s1;return s1;
}S get_uname()
{return S();
}S s;
s = get_uname(); /// 失去优势,即使触发了RVO,这里也是assign。

可以通过传入引用的方式/指针用法 避免RVO失去优势

void get_F1(S& s) {s.i = 8;
}S* get_F2() {S* ps = new S; // 2. default ctor 2ps->i = 8;return ps;     // should be freed later
}int main() {S s;           // 1. default ctor 1get_F1(s);std::cout << s.i << '\n';S* ps{ get_F2() };std::cout << ps->i << '\n';delete ps;     // 3. dtor 2
} // 4. dtor 1
  1. 函数本身不能从不同路径返回命名对象
/// 触发
S get_D1(int x) {S s;                // 1. default ctor 1if (x % 2 == 0) {s.i = 8;return s;} else {s.i = 22;return s;}
}/// 不触发 会引起拷贝构造
S get_D2(int x) {if (x % 2 == 0) {S s1;          // 2. default ctor 2 (or default ctor for s2 below)s1.i = 8;return s1;} else {S s2;          // 2. default ctor 2 (or default ctor for s1 above)s2.i = 22;return s2;}
} // 3. copy ctor 3 (either s1 or s2 above); 4. dtor 2S s = get_D1();// 触发RVO
S s1 = get_D2(); // 不触发RVO 拷贝构造

http://www.ppmy.cn/embedded/128112.html

相关文章

Q2=17.8和w=0.6198情况

&#xff08;个人学习笔记&#xff0c;仅供参考&#xff09; import numpy as np from scipy.special import kv, erfc from scipy.integrate import dblquad import matplotlib.pyplot as plt import scipy.integrate as spiw 0.6198 g0_sq 21.5989 rho 0.782908 Q2 17.8…

一个Idea:爆改 T480

爆改 T480 准备大改 T480&#xff0c;家里有一台闲置很久的 T480&#xff0c;不舍得扔&#xff0c;打算升级一下。看了几位up主的视频后&#xff0c;决定动手改造。 计划如下 网卡&#xff1a;加装4G网卡硬盘&#xff1a;更换为 1T 的 NVMe 2280 固态硬盘内存&#xff1a;升…

ubuntu重启后显示不出图形界面

我的情况时这样的&#xff1a; 由于在配置ens33时&#xff0c;跟着一篇帖子进行流程 输入reboot重启后&#xff0c;打不开图形界面。 我的解决办法是这样的&#xff1a; 检查当前的运行级别&#xff1a; Ubuntu使用运行级别来决定系统的状态。运行级别3是文本模式&#xff0c;…

滚雪球学Redis[5.3讲]:Redis持久化优化深度解析:RDB与AOF的策略选择与实践

全文目录&#xff1a; &#x1f389;前言&#x1f6a6;Redis的监控与报警&#x1f504;1. 使用Redis自带工具进行监控&#x1f3af;1.1 Redis常用监控命令&#x1f3af;1.2 Redis配置文件中的监控相关参数 ⚙️2. 使用第三方工具进行Redis监控&#x1f4a1;2.1 Prometheus与Red…

大模型入门到精通!大模型应用开发极简入门(含PDF)

大模型的出现正悄然改变人们的生活与工作方式&#xff0c;比如ChatGPT-4、文心一言、通义千问等语言大模型。它们已帮助很多办公室“白领”们在解决日常工作问题&#xff0c;如制定计划、撰写实施方案&#xff0c;甚至制作美化PPT等&#xff08;笔者及身边的同事在工作中还经常…

空间计算:现实与数字世界的无缝融合

随着增强现实&#xff08;AR&#xff09;、虚拟现实&#xff08;VR&#xff09;、物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;的不断进步&#xff0c;空间计算&#xff08;Spatial Computing&#xff09;作为一种新兴技术&#xff0c;正在成为人们…

基于Java微信小程序的水果销售系统详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

RK3568平台开发系列讲解(调试篇)CGroup(Control Group)之内存管控

🚀返回专栏总目录 文章目录 一、配置宏二、使用方法三、节点说明四、调试沉淀、分享、成长,让自己和他人都能有所收获!😄 CGroup 的全称是 Control Group,是容器实现环境隔离的两种关键技术之一,它对很多子系统提供精细化的控制的能力,比如下面这些: CPU内存IO网络CG…