前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++返回值优化RVO

C++返回值优化RVO

作者头像
大石头
发布2018-01-09 17:44:53
1.2K0
发布2018-01-09 17:44:53
举报
文章被收录于专栏:智能大石头智能大石头

返回值优化,是一种属于编译器的技术,它通过转换源代码和对象的创建来加快源代码的执行速度。RVO = return value optimization。 测试平台:STM32F103VG + Keil 5.15 背景: 我们有个MacAddress::ToArray

代码语言:javascript
复制
byte* MacAddress::ToArray() const
{
        return (byte*)&Value;
}

因为封装需要,打算返回字节数组类ByteArray的对象,于是有

代码语言:javascript
复制
ByteArray MacAddress::ToArray() const
{
        return ByteArray((byte*)&Value, 6);
}

调用代码

代码语言:javascript
复制
ByteArray bs = mac.ToArray();
bs.CopyTo(General_reg.SHAR);

按照我浅薄的C++知识理解,在ToArray内return 的时候,会产生一次对象拷贝,到临时对象。 然后在调用者那里的等号,产生一次拷贝构造。 实际上,编译烧写调试,查看反汇编

代码语言:javascript
复制
   358:         ByteArray bs = mac.ToArray(); 
0x0800595C 4629      MOV      r1,r5
0x0800595E A804      ADD      r0,sp,#0x10
0x08005960 F000FE92  BL.W     MacAddress::ToArray (0x08006688)
   359:         bs.CopyTo(General_reg.SHAR); 
   360:  
0x08005964 2300      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的反汇编

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

天哪!这里面只有一次构造函数,并不是猜想的那样,先构造本地变量,然后return再拷贝。 并且,这个构造函数的内存地址,正是外部传进去的那一个。 这个就是C++的RVO,返回值优化技术,没想到MDK也支持。 这个技能的获取,让我C++水平从30%提升到40%

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-09-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档