zoukankan      html  css  js  c++  java
  • 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, 6);
    }

    调用代码

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

    按照我浅薄的C++知识理解,在ToArray内return 的时候,会产生一次对象拷贝,到临时对象。
    然后在调用者那里的等号,产生一次拷贝构造。

    实际上,编译烧写调试,查看反汇编

       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的反汇编

    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%

  • 相关阅读:
    vue中的 computed 和 watch 的区别
    mysql8.0 初始化数据库及表名大小写问题
    sql server alwayson 调整数据文件路径
    zabbix 自定义监控 SQL Server
    mysql 创建用户及授权
    mysql 设置从库只读模式
    mysql8.0 主从复制安装及配置
    centos8.0安装mysql8.0
    centos8替换阿里数据源
    npm publish 报错 【you or one of your dependencies are requesting a package version that is forbidden by your security policy】
  • 原文地址:https://www.cnblogs.com/nnhy/p/rvo.html
Copyright © 2011-2022 走看看