- 浏览: 379274 次
- 性别:
- 来自: 苏州
-
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
转自
http://blog.chinaunix.net/uid-25872711-id-3018672.html
返回值优化 Return Value Optimization,简称RVO
RVO是由编译器实现的,其优化原理如以下示例代码:
看到有下面操作符的重载定义:
假设c1、c2、c3都是Complex类型,我们执行如下操作:
编译器是如何调用operator+的呢?大致伪码如下:
不做优化的情况下Complex_Add内部为:
可以看的出来,这里存在retVal的构造和析构的浪费。编译器可以通过消除局部对象retVal来做优化,这就是返回值优化:
经过时间测试,发现使用RVO前后的执行时间相差50%左右。
因为RVO是由编译器选择性使用,如存在多个返回分支的情况一般编译器不会使用RVO。如下:
发现编译器对version 1没有使用RVO,version 2有使用。有些编译器对命名变量作为返回值的函数不做RVO,而不进行命名直接通过构造函数返回是可以的。
我们应该了解编译器RVO开启条件,并且尽量使用可以进行优化的编码风格,如version 2。
http://blog.chinaunix.net/uid-25872711-id-3018672.html
Efficient C ++ 第四章 RVO
返回值优化 Return Value Optimization,简称RVO
RVO是由编译器实现的,其优化原理如以下示例代码:
class Complex { // Complex addition operator friend Complex operator+(const Complex&, const Complex&); public: // Default constructor. // Value defaults to 0 unless otherwise specified. Complex (double r = 0.0, double i = 0.0) : real (r), imag (i) {} // Copy constructor Complex (const Complex& c) : real (c.real), imag (c.imag) {} // Assignment operator Complex& operator= (const Complex& c); ~Complex() {} private: double real; double imag; };
看到有下面操作符的重载定义:
Complex operator+ (const Complex& a, const Complex& b) { Complex retVal; retVal.real = a.real + b.real; retVal.imag = a.imag + b.imag; return retVal; }
假设c1、c2、c3都是Complex类型,我们执行如下操作:
c3 = c1 + c2;
编译器是如何调用operator+的呢?大致伪码如下:
//创建一个临时__result对象,并做为参数传入如下函数原型 void Complex_Add (const Complex& __result, const Complex& c1, const Complex& c2) { ... } //那么c3 = c1 + c2;实际执行了 struct Complex __tempResult; // 临时对象,不构造 Complex_Add(__tempResult,c1,c2); // 传入参数 c3 = __tempResult; // 把临时对象赋值给c3
不做优化的情况下Complex_Add内部为:
void Complex_Add(const Complex& __tempResult, const Complex& c1, const Complex& c2) { struct Complex retVal; retVal.Complex::Complex(); //调用构造函数 retVal.real = a.real + b.real; retVal.imag = a.imag + b.imag; __tempResult.Complex::Complex(retVal);//拷贝构造__tempResult retVal.Complex::~Complex(); //析构retVal return; }
可以看的出来,这里存在retVal的构造和析构的浪费。编译器可以通过消除局部对象retVal来做优化,这就是返回值优化:
void Complex_Add (const Complex& __tempResult, const Complex& c1, const Complex& c2) { __tempResult.Complex::Complex(); // Construct __tempResult __tempResult.real = a.real + b.real; __tempResult.imag = a.imag + b.imag; return; }
经过时间测试,发现使用RVO前后的执行时间相差50%左右。
因为RVO是由编译器选择性使用,如存在多个返回分支的情况一般编译器不会使用RVO。如下:
Complex operator+ (const Complex& a, const Complex& b) // operator+ version 1. { Complex retVal; retVal.real = a.real + b.real; retVal.imag = a.imag + b.imag; return retVal; } Complex operator+ (const Complex& a, const Complex& b) // operator+ version 2. { double r = a.real + b.real; double i = a.imag + b.imag; return Complex (r,i); }
发现编译器对version 1没有使用RVO,version 2有使用。有些编译器对命名变量作为返回值的函数不做RVO,而不进行命名直接通过构造函数返回是可以的。
我们应该了解编译器RVO开启条件,并且尽量使用可以进行优化的编码风格,如version 2。
- Efficient.C__.Performance.Programming.Techniques.zip (1.4 MB)
- 下载次数: 0
发表评论
-
FreeRTOS
2022-03-05 16:31 268Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 433https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1374https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 498https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 602// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 623https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 6108583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 620参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2211基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9341 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1627OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1901ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 901转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1954转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1117C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 992转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 1040转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 845参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1643转自 http://blog.csdn.net/weixinh ...
相关推荐
使用Unity引擎进行游戏开发时,可以利用RVO(Reciprocal Velocity Obstacles)算法来有效解决这一问题。RVO算法是一种实时动态避障算法,能够处理大量物体在同一场景中的移动和碰撞避免问题。通过这种方法,即使是...
《Navmesh2Rvo:基于RVO2的高级路径规划技术》 在游戏开发和模拟环境中,路径规划是一项至关重要的任务,它使得虚拟角色能够智能地在复杂环境中移动。Navmesh2Rvo是一个专为此目的设计的模块,它基于RVO2算法,实现...
《RVO2100/RVO2100L使用说明》是一款基于LabVIEW环境的设备操作手册。LabVIEW,全称Laboratory Virtual Instrument Engineering Workbench(实验室虚拟仪器工程工作台),是由美国国家仪器(NI)公司开发的一种图形...
最佳的对撞避免 我们提出了一种避免相互碰撞的正式方法,其中多个独立的移动机器人或特工在公共工作空间中移动时... RVO2库是二维的我们算法的开源C ++ 98实现。 它具有用于第三方应用程序的简单API。 用户指定静态障
【碰撞规避算法RVO(Reciprocal Velocity Obstacles)】是一种高级的算法,常用于解决机器人、人群模拟、游戏和交通工程等领域中的碰撞避免问题。RVO算法在基础的【Velocity Obstacle (VO)】算法上进行了优化,有效...
**RVO4100/RVO4050使用说明** 在IT领域,尤其是在嵌入式系统和自动化设备的设计与开发中,RVO4100和RVO4050是两种常见的设备,可能涉及到数据采集、信号处理或者控制系统。它们通常配备有相应的软件或固件,以便...
**C#版RVO算法详解** RVO,全称为Relative Velocity Obstacle(相对速度障碍物)算法,是一种在多智能体系统中实现碰撞避免的有效方法。尤其在实时战略(RTS)游戏或多人在线战斗竞技场(Moba)游戏中,确保多个...
本压缩包“RVO2和物理的混合使用Plugins.zip”正是针对Unreal Engine 5(UE5)开发环境下,提供了一套集成RVO2算法与物理引擎相结合的解决方案。 UE5作为新一代游戏引擎,不仅提供了强大的渲染效果和物理模拟,还...
4. **多智能体交互**:库支持同时处理多个智能体的避障问题,可以有效地处理大规模群体的动态避障。 5. **优化与性能**:RVO2LIB通常进行了优化,以保证在大规模场景下也能有良好的计算性能和实时性。 6. **API...
《RVO3050软件3.14中文版——基于LabVIEW的高效工具》 在信息技术领域,软件是至关重要的组成部分,而今天我们要探讨的是名为“RVO3050”的软件,其3.14中文版为用户带来了全新的体验。这款软件专为Windows 95/98...
《RVO3100软件3.14中文版——基于LabVIEW的高效控制系统解析》 RVO3100软件3.14中文版是一款专为自动化控制领域设计的应用程序,它以其强大的功能和易用性在业界享有盛誉。这款软件的核心是基于美国国家仪器公司...
速度障碍法(RVO, Reciprocal Velocity Obstacle)与双向速度障碍物(DVO, Dual Velocity Obstacle)是机器人路径规划中的两种重要算法,主要用于解决多智能体避障问题。这两种方法在自主驾驶、无人机导航、机器人...
RVO2100L_2K Ver1.45c.EXE是该测控软件的安装程序,版本号为1.45c,适用于Windows 2000操作系统。这个版本可能包含了一些性能优化和错误修复,以提升软件的稳定性和可靠性。安装过程中,用户应按照提示进行,确保...
"Rvo2100L Ver1.45c.EXE"是该示波器配套的测控软件,用于远程控制和数据分析,版本1.45c意味着软件经过多次优化,具有更高的稳定性和兼容性。 该测控软件提供用户友好的界面,可实现对示波器的全面控制,包括设置...
这个压缩包文件"相互速度障碍物_rvo_RVO速度障碍物的计算程序_c#路径障碍物_机器人_路径规划.zip"似乎包含了一个C#实现的算法,专门用于解决多机器人系统中的路径规划和避障问题。该算法可能基于RVO(Relative ...
最佳的三维互撞避免 我们提出了一种避免相互碰撞的正式方法,其中多个独立的移动机器人或特工在公共工作空间中移动时,... RVO2-3D库是我们算法的三个方面的开源C ++ 98实现。 它具有用于第三方应用程序的简单API。
在给定的压缩包文件"相互速度障碍物_rvo_RVO速度障碍物的计算程序_c#路径障碍物_机器人_路径规划_源码.zip"中,我们可以深入探讨几个关键的IT知识点,主要涉及机器人路径规划、速度障碍物计算以及C#编程语言的应用。...
标题中的"matlabDijkstra +冲击最小的虎鲸(RVO2)"揭示了这个压缩包包含的是与MATLAB相关的算法实现,特别是Dijkstra算法和RVO2(Recursive Velocity Obstacles for Two-Agent Navigation)算法,这是一种用于多智能...
RVO2-3D, 在三维( C ) 中,最佳互冲突避免 三维最优互冲突避免的算法http://gamma.cs.unc.edu/RVO2/ Chapel Hill的版权所有 2008大学在Apache许可以证下许可以证版本 2.0 ("许可以证") ;你可以能不使用这里文件,...
其中,Return Value Optimization (RVO) 是C++编译器提供的一种优化技术,旨在减少不必要的对象复制,特别是在函数返回值时。本篇文章将深入探讨RVO的概念、工作原理以及如何通过反汇编代码来观察和理解RVO的实现。 ...