C++返回值优化RVO
返回值优化,是一种属于编译器的技术,它通过转换源代码和对象的创建来加快源代码的执行速度。RVO = return value optimization。
测试平台:STM32F103VG + Keil 5.15
背景:
我们有个MacAddress::ToArray
byte* MacAddress::ToArray() const
{
return (byte*)&Value;
}
因为封装需要,打算返回字节数组类ByteArray的对象,于是有
ByteArray MacAddress::ToArray() const
{
return ByteArray((byte*)&Value, );
}
调用代码
ByteArray bs = mac.ToArray();
bs.CopyTo(General_reg.SHAR);
按照我浅薄的C++知识理解,在ToArray内return 的时候,会产生一次对象拷贝,到临时对象。
然后在调用者那里的等号,产生一次拷贝构造。
实际上,编译烧写调试,查看反汇编
: ByteArray bs = mac.ToArray();
0x0800595C MOV r1,r5
0x0800595E A804 ADD r0,sp,#0x10
0x08005960 F000FE92 BL.W MacAddress::ToArray (0x08006688)
: bs.CopyTo(General_reg.SHAR);
:
0x08005964 MOVS r3,#0x00
0x08005966 461A MOV r2,r3
0x08005968 F1040109 ADD r1,r4,#0x09
0x0800596C A804 ADD r0,sp,#0x10
0x0800596E F002FB8F BL.W Array::CopyTo (0x08008090)
直接分配内存,传入ToArray使用。ToArray之后,并没有见到所猜想的第二次拷贝构造。
下面看看ToArray的反汇编
0x08006688 B570 PUSH {r4-r6,lr}
0x0800668A MOV r5,r0
0x0800668C 460C MOV r4,r1
: return ByteArray((byte*)&Value, );
0x0800668E MOVS r2,#0x06
0x08006690 F1040108 ADD r1,r4,#0x08
0x08006694 MOV r0,r5
0x08006696 F7FFFDEB BL.W _ZN9ByteArrayC2EPKhi (0x08006270)
0x0800669A MOV r5,r0
: }
0x0800669C BD70 POP {r4-r6,pc}
天哪!这里面只有一次构造函数,并不是猜想的那样,先构造本地变量,然后return再拷贝。
并且,这个构造函数的内存地址,正是外部传进去的那一个。
这个就是C++的RVO,返回值优化技术,没想到MDK也支持。
这个技能的获取,让我C++水平从30%提升到40%
C++返回值优化RVO的更多相关文章
- 返回值优化 RVO
<深度探索C++对象模型>-- 2.3 返回值的初始化 & 在编译器层面做优化
- 【M20】协助完成“返回值优化(RVO)”
1.方法返回对象,会导致临时对象的产生,这降低了效率,const Rational operator* (const Rational& lhs,Rational& rhs).有没有什 ...
- 返回值优化(RVO)
C++的函数中,如果返回值是一个对象,那么理论上它不可避免的会调用对象的构造函数和析构函数,从而导致一定的效率损耗.如下函数所示: A test() { A a; return a; } 在test函 ...
- 一段小代码秒懂C++右值引用和RVO(返回值优化)的误区
关于C++右值引用的参考文档里面有明确提到,右值引用可以延长临时变量的周期.如: std::string&& r3 = s1 + s1; // okay: rvalue referen ...
- [转] C++中临时对象及返回值优化
http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...
- [More Effective C++]条款22有关返回值优化的验证结果
(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...
- 转:C++中临时对象及返回值优化
http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...
- C++返回值优化
返回值优化(Return Value Optimization,简称RVO)是一种编译器优化机制:当函数需要返回一个对象的时候,如果自己创建一个临时对象用于返回,那么这个临时对象会消耗一个构造函数(C ...
- C++标准库之string返回值研究
先说结论(不一定适用所有环境): 1) GCC默认开启了返回值优化(RVO),除非编译时指定“-fno-elide-constructors”: 2) 现代C++编译器一般都支持返回值优化: 3) s ...
随机推荐
- Ration Rose2003安装及破解
曾经学习UML的时候,用的是EA. 近期在看Head First想着画绘图装一下Ration Rose吧.于是就着手開始装.本来网上关于Ration Rose的安装及破解教程非常多,可是我在安装的过程 ...
- Winform开发框架中工作流模块之审批会签操作
在前面介绍了框架中工作流的几个开发过程,本篇随笔重点介绍一下日常审批环节中的具体处理过程,从开始创建表单,以及各个审批.会签过程的流转过程,希望大家对其中流程的处理有一个大概的印象. 1.请假申请表单 ...
- 关于IntelliJ IDEA有时候快捷键无效的说明
1.这个原因最大的因素可能就是 搜狗输入法了, 关闭搜狗输入法,ok, 2.也可能是qq快捷键冲突,关闭它. 3.也可能是搜狗输入法快捷键冲突,关闭它.
- Intellij 解除(去除)SVN关联
方法一:通过Intellj 来处理 1. 安装插件 打开Intellij的setting(ctrl+alt+s),选择plugins,在右边搜索框输入"SVN",搜索.选择&quo ...
- Linux主机SSH免密设置解析
为了保证一台Linux主机的安全,所以我们每个主机登录的时候一般我们都设置账号密码登录.但是很多时候为了操作方便,我们都通过设置SSH免密码登录.那么该如何设置?是不是免密码登录就不安全了呢? 一.被 ...
- 用户信息文件/etc/passwd,影子文件/etc/shadow,组信息文件/etc/group,组密码文件/etc/gshadow,用户管理相关文件
/etc/passwd man 5 passwd查看配置文件信息 account:password:UID:GID:GECOS:directory:shell 帐号:密码:用户ID:组ID:一般的信息 ...
- ReactNative 基础学习
安卓Back键的处理·基本+高级篇 http://bbs.reactnative.cn/topic/480/%E5%AE%89%E5%8D%93back%E9%94%AE%E7%9A%84%E5%A4 ...
- 学习ABP ASP.NET Core with Angular 环境问题
1. 前言 最近学习ABP架构 搭建ASP.NET Core with Angular遇到了些问题,折腾了一个礼拜最终在今天解决了,想想这个过程的痛苦就想利用博客记录下来.其实一直想写博客,但因为 时 ...
- COM_第四讲_保存GUID_优化使用代码
优化以前的代码,让使用者更方便 一丶 优化思路 1.我们可以将我们写的GUID(类工厂的ID)保存到注册表中,并且保存一下DLL的文件路径,遍历注册表去DLL路径即可. 2.每个类工厂我们就要使用一个 ...
- bzoj 3669: [Noi2014] 魔法森林 LCT版
Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...