博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++返回值优化RVO
阅读量:7196 次
发布时间:2019-06-29

本文共 1635 字,大约阅读时间需要 5 分钟。

返回值优化,是一种属于编译器的技术,它通过转换源代码和对象的创建来加快源代码的执行速度。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, 6);}

调用代码

ByteArray bs = mac.ToArray();bs.CopyTo(General_reg.SHAR);

按照我浅薄的C++知识理解,在ToArray内return 的时候,会产生一次对象拷贝,到临时对象。

然后在调用者那里的等号,产生一次拷贝构造。
实际上,编译烧写调试,查看反汇编

复制代码
358:         ByteArray bs = mac.ToArray(); 0x0800595C 4629      MOV      r1,r50x0800595E A804      ADD      r0,sp,#0x100x08005960 F000FE92  BL.W     MacAddress::ToArray (0x08006688)   359:         bs.CopyTo(General_reg.SHAR);    360:  0x08005964 2300      MOVS     r3,#0x000x08005966 461A      MOV      r2,r30x08005968 F1040109  ADD      r1,r4,#0x090x0800596C A804      ADD      r0,sp,#0x100x0800596E F002FB8F  BL.W     Array::CopyTo (0x08008090)
复制代码

直接分配内存,传入ToArray使用。ToArray之后,并没有见到所猜想的第二次拷贝构造。

下面看看ToArray的反汇编

复制代码
0x08006688 B570      PUSH     {r4-r6,lr}0x0800668A 4605      MOV      r5,r00x0800668C 460C      MOV      r4,r1   481:         return ByteArray((byte*)&Value, 6); 0x0800668E 2206      MOVS     r2,#0x060x08006690 F1040108  ADD      r1,r4,#0x080x08006694 4628      MOV      r0,r50x08006696 F7FFFDEB  BL.W     _ZN9ByteArrayC2EPKhi (0x08006270)0x0800669A 4605      MOV      r5,r0   482: } 0x0800669C BD70      POP      {r4-r6,pc}
复制代码

天哪!这里面只有一次构造函数,并不是猜想的那样,先构造本地变量,然后return再拷贝。

并且,这个构造函数的内存地址,正是外部传进去的那一个。
这个就是C++的RVO,返回值优化技术,没想到MDK也支持。
这个技能的获取,让我C++水平从30%提升到40%

 

我不相信神话,我只相信汗水!我不相信命运,我只相信双手!
分类:
本文转自大石头博客园博客,原文链接:http://www.cnblogs.com/nnhy/p/rvo.html,如需转载请自行联系原作者
你可能感兴趣的文章
MaxCompute用户初体验
查看>>
阿里云十年再出发,边缘计算已启航
查看>>
代理服务器与网络地址转换NAT
查看>>
Linux Shell 基本概念及编程(7)
查看>>
我的友情链接
查看>>
SQL Server 镜像
查看>>
NFS-网络文件系统配置
查看>>
Apache Thrift入门1-架构&介绍
查看>>
rabbitmq集群是否出现脑裂监控
查看>>
java synchronized关键字的用法--对象锁和类锁
查看>>
任务3 SQL语句相关问题
查看>>
c primer plus(第五版)读书笔计 第四章(3)
查看>>
c primer plus(第五版)读书笔计 第六章(6)
查看>>
MAC OS 10.10.5虚拟机免费下载(可安装Xcode7)
查看>>
我的友情链接
查看>>
Office 365 系列之八:批量部署 O365 客户端
查看>>
分享Kali Linux 2017年第30周镜像文件
查看>>
Centos6.8部署jenkins2.46.2
查看>>
SQL Server 内存分配
查看>>
Java 之原型模式
查看>>