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%

 

我不相信神话,我只相信汗水!我不相信命运,我只相信双手!
分类: C++

本文转自大石头博客园博客,原文链接:http://www.cnblogs.com/nnhy/p/rvo.html,如需转载请自行联系原作者
目录
相关文章
|
存储 编译器 C语言
【C/C++ 函数返回的奥秘】深入探究C/C++函数返回:编译器如何处理返回值
【C/C++ 函数返回的奥秘】深入探究C/C++函数返回:编译器如何处理返回值
1204 3
|
JavaScript 编译器 API
【C++ 函数和过程 进阶篇】全面掌握C++函数返回值:从入门到精通的实战指南
【C++ 函数和过程 进阶篇】全面掌握C++函数返回值:从入门到精通的实战指南
701 1
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
681 0
|
安全 算法 C++
【C++泛型编程 进阶篇】模板返回值的优雅处理(二)
【C++泛型编程 进阶篇】模板返回值的优雅处理
321 0
|
安全 算法 编译器
【C++泛型编程 进阶篇】模板返回值的优雅处理(一)
【C++泛型编程 进阶篇】模板返回值的优雅处理
533 0
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
587 6
|
编译器 C++ 开发者
C++一分钟之-返回值优化与Move Semantics
【6月更文挑战第19天】C++的RVO与移动语义提升效率,减少对象复制。RVO是编译器优化,避免临时对象的创建。移动语义通过右值引用和`std::move`转移资源所有权。注意RVO不是总有效,不应过度依赖。使用移动语义时,避免误用`std::move`导致对象无效。示例展示了RVO和移动构造函数的应用。理解并恰当使用这些机制能写出更高效代码。
243 3
|
存储 算法 编译器
【C++ 函数 基础教程 第四篇】深入C++函数返回值:理解并优化其性能
【C++ 函数 基础教程 第四篇】深入C++函数返回值:理解并优化其性能
1058 1
|
定位技术 C++ Python
C++一个函数返回两个或更多个返回值的方法
C++一个函数返回两个或更多个返回值的方法
429 1
|
编译器 C++
【C++14保姆级教程】数位分割符、函数返回值推导
【C++14保姆级教程】数位分割符、函数返回值推导
320 0