C++—返回值优化

2023-10-30

返回值优化(Return value optimization,缩写为RVO)是C++的一项编译优化技术,即删除保持函数返回值的临时对象。这可能会省略两次复制构造函数。当一个函数返回一个对象实例,一个临时对象将被创建并通过复制构造函数把目标对象复制给这个临时对象。C++标准允许省略这些复制构造函数,从某种程度上可以提高程序的运行效率,对需要分配大量内存的类对象其值复制过程十分友好。
举例

//test.cpp
#include <iostream>
using namespace std;
class A
{
public:
  A(){cout<<"constructor"<<endl;}
  A(const A& a){cout<<"copy constructor"<<endl;}
  ~A(){cout<<"destructor"<<endl;}
};
A fun()                                                                           
{
 A a1;
 return a1;
}
int main()
{
 A a2=fun();
 return 0;
}

关闭返回值优化
g++ -o a test.cpp -fno-elide-constructors

constructor //构造a1
copy constructor //a1复制到临时变量
destructor //析构a1
copy constructor //临时变量复制到a2
destructor //析构临时变量
destructor //析构a2

保留返回值优化

constructor //构造a1
destructor  //析构a1

如果我们打印一下地址就会发现

constructor  0x7ffda7ce023f
destructor   0x7ffda7ce023f

构造和析构的是同一个对象实例

编译器明确知道函数会返回哪一个局部对象,那么编译器会把这个局部对象的地址和临时对象的地址进行复用,也就是说避免了从局部对象到临时对象的拷贝操作,这就是RVO。
参考:
编译器之返回值优化

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++—返回值优化 的相关文章

  • 无法使用 strptime() 获取秒数

    我收到 YYYY MM DDThh mm ss S Z hh mm 这种格式的日期时间 我正在尝试使用复制该值strptime如下所示 struct tm time 0 char pEnd strptime datetime Y m dT
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • vue项目提交Git如何取消代码检查

    vue项目一般会有一个提交代码时的校验 一般提交需要git commit m no verify 才能跳过校验 不想每次提交都输入 no verify可以进行如下配置 找到项目根目录下的 eslintignore 写入如下配置 build
  • BUUCTF__[极客大挑战 2019]Havefun_题解

    看题 这题真的是最简单的一题了 以至于看到flag还以为是假的 毕竟吃过假flag的亏 拿到题目 很好看 相关性F12 发现被注释的代码 很简单的一段代码 尝试get传入cat dog http e2c1cdbb e689 45c2 ba6
  • Spring-Data-Elasticsearch实现 条件查询+分页+高亮+排序功能

    一 依赖 Spring Boot 2 4 5 Elasticsearch 7 13 2 Kibana 7 13 2
  • 第一章习题

    第一章 对网络的基本认识 一 单选题 1 连接在因特网上的计算机称为 A 主机 B 路由器 C 交换机 D 电脑 正确答案 A 2 Internet的前身是 A NASA B ARPANET C NGI D internet 正确答案 B
  • 3DMAX安装未完成,某些产品无法安装的解决方法

    3DMAX提示安装未完成 某些产品无法安装该怎样解决呢 一些朋友在win7或者win10系统下安装3DMAX失败提示3DMAX安装未完成 某些产品无法安装 也有时候想重新安装3DMAX的时候会出现本电脑windows系统已安装3DMAX 你
  • Docker 搭建 Gitlab 服务器(修改端口)

    环境 Docker version 23 0 3 GitLab Community Edition 15 10 2 Gitlab安装教程 安装GitLab官方推荐至少4G的内存 否则可能会卡顿或者运行非常慢 建议采用4G以上的云服务进行测试
  • SSHFD:IBM提出的单阶段人体跌倒检测网络

    点击上方 AI算法修炼营 选择 星标 公众号 精选作品 第一时间送达 这篇文章是由IBM研究院发表的有关于老人跌倒识别的文章 整体网络比较复杂 代码也没有开源 就不精读了 水一水了解个大概就行了吧 论文地址 http xxx itp ac
  • [游戏开发]UGF 配表导出工具

    0 前言 整理一下 之前做的一个配表导出工具 主要作用就是将 excel 的内容导出为数据和代码 不用每次配表都重新处理 项目的源码还有exe 都上传到了百度云 链接如下 链接 https pan baidu com s 1xW9Rc cx
  • 试题 算法训练 最小距离

    试题 算法训练 最小距离 资源限制 时间限制 1 0s 内存限制 256 0MB 最小距离 问题描述 数轴上有n个数字 求最近的两个数 即min abs x y 输入格式 第一行包含一个整数n 接下来一行 表示n整数 输出格式 一个整数表示
  • 【ES6】学ES6一篇就够了

    ES6 let 声明变量 let 关键字声明变量是在 es6 中引入的 使用 let 声明变量主要有以下特点 使用 let 声明的变量具有块级作用域 使用 let 声明的变量没有变量提升 使用 let 声明的变量具有暂时性死区 let 声明
  • 编译原理书籍推荐

    大学课程为什么要开设编译原理呢 这门课程关注的是编译器方面的产生原理和技术问题 似乎和计算机的基础领域不沾边 可是编译原理却一直作为大学本科的必修课程 同时也成为了研究生入学考试的必考内容 编译原理及技术从本质上来讲就是一个算法问题而已 当
  • Unity3D 鼠标控制角色移动与奔跑

    最新补充 一般在做鼠标选择时是从摄像机向目标点发送一条射线 然后取得射线与对象相交的点来计算3D目标点 后来在开发中发现了一个问题 射线被别的对象挡住了 就是如果主角的前面有别的游戏对象挡着 此时如果使用射线的原理 鼠标选择被档的对象 这样
  • Java高效开发-远程debug

    1 前言 这怎么回事 在本地还好好 放到服务器就不行了 这该怎么排查 日志也看不出来啥呀 日常开发中经常会出现这种问题 这时候就可以尝试idea远程debug的模式试试 2 使用 1 环境 idea2021 2 idea配置 重点 将自动生
  • 解决Could not find artifact com.oracle:ojdbc7:pom:12.1.0.2 的方案

    1 试了很多方法 不行 2 最终方案 使用私服nexus解决 3 idea创建maven项目 引入lib文件夹 3 1 打包后上传到私服 坐标为
  • Windows10+Python3.6+创建虚拟环境+pycharm+mySQL+flask (一)

    1 安装Python3 6 首先下载python3 6 https www python org getit 在官网上 下下来之后可以在你的下载路径里面找到 我是64位的操作系统 双击安装 这里注意一下要选择 Add Python3 6 t
  • umi——02——mook和反向代理(跨域)

    1 测试mock的简单使用 首先我们在mock文件夹创建一个文件 文件名随便取 写上这样一段代码 代表Get请求 在登录组件Login中发起请求 启动项目 并在项目的url地址输入 users 就可以看到 2 登录案例 api js exp
  • Linux磁盘配额配置

    磁盘配额配置 1 理解磁盘配额的作用 2 掌握磁盘配额工具 3 掌握磁盘配额配置的方法 任务 账号为user 密码为123456的用户磁盘限额情况如下 user用户能够取得80KB的磁盘使用量 hard 文件数量为5个 只要容量使用超过30
  • java 文件下载进度条_下载文件时显示动态的进度条(前端easyUI,后台java)

    最近有点闲 我们的架构师让我在文件下载时显示进度条 咳咳 自从组里来了前端妹纸后 好久没写前端代码了 架构师推荐的用监听器 链接找不到了 实现得有点复杂 我没太看懂 继续百度 看到了 在下载时计算进度 然后把进度放到session中 另外写
  • 查看哪个进程占用了8005端口,并杀死占用端口的进程。

    查看哪个进程占用了8005端口 netstat ano findstr 8005 返回进程号 通过进程号杀死占用端口的进程 taskkill PID 19288 F 杀死该进程 F是强制删除
  • C++—返回值优化

    返回值优化 Return value optimization 缩写为RVO 是C 的一项编译优化技术 即删除保持函数返回值的临时对象 这可能会省略两次复制构造函数 当一个函数返回一个对象实例 一个临时对象将被创建并通过复制构造函数把目标对