`

Efficient C ++ 第四章 RVO

 
阅读更多
转自
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。
分享到:
评论

相关推荐

    RVO 处理海量物体同屏避障

    使用Unity引擎进行游戏开发时,可以利用RVO(Reciprocal Velocity Obstacles)算法来有效解决这一问题。RVO算法是一种实时动态避障算法,能够处理大量物体在同一场景中的移动和碰撞避免问题。通过这种方法,即使是...

    Navmesh2Rvo

    《Navmesh2Rvo:基于RVO2的高级路径规划技术》 在游戏开发和模拟环境中,路径规划是一项至关重要的任务,它使得虚拟角色能够智能地在复杂环境中移动。Navmesh2Rvo是一个专为此目的设计的模块,它基于RVO2算法,实现...

    RVO2100/RVO2100L使用说明.zip

    《RVO2100/RVO2100L使用说明》是一款基于LabVIEW环境的设备操作手册。LabVIEW,全称Laboratory Virtual Instrument Engineering Workbench(实验室虚拟仪器工程工作台),是由美国国家仪器(NI)公司开发的一种图形...

    RVO2:最佳双向碰撞避免(C ++)

    最佳的对撞避免 我们提出了一种避免相互碰撞的正式方法,其中多个独立的移动机器人或特工在公共工作空间中移动时... RVO2库是二维的我们算法的开源C ++ 98实现。 它具有用于第三方应用程序的简单API。 用户指定静态障

    碰撞规避算法RVO(Reciprocal Velocity Obstacles)简介1

    【碰撞规避算法RVO(Reciprocal Velocity Obstacles)】是一种高级的算法,常用于解决机器人、人群模拟、游戏和交通工程等领域中的碰撞避免问题。RVO算法在基础的【Velocity Obstacle (VO)】算法上进行了优化,有效...

    RVO4100/RVO4050使用说明.zip

    **RVO4100/RVO4050使用说明** 在IT领域,尤其是在嵌入式系统和自动化设备的设计与开发中,RVO4100和RVO4050是两种常见的设备,可能涉及到数据采集、信号处理或者控制系统。它们通常配备有相应的软件或固件,以便...

    C#版 RVO算法

    **C#版RVO算法详解** RVO,全称为Relative Velocity Obstacle(相对速度障碍物)算法,是一种在多智能体系统中实现碰撞避免的有效方法。尤其在实时战略(RTS)游戏或多人在线战斗竞技场(Moba)游戏中,确保多个...

    RVO2和物理的混合使用Plugins.zip

    本压缩包“RVO2和物理的混合使用Plugins.zip”正是针对Unreal Engine 5(UE5)开发环境下,提供了一套集成RVO2算法与物理引擎相结合的解决方案。 UE5作为新一代游戏引擎,不仅提供了强大的渲染效果和物理模拟,还...

    群体仿真RVO2LIB

    4. **多智能体交互**:库支持同时处理多个智能体的避障问题,可以有效地处理大规模群体的动态避障。 5. **优化与性能**:RVO2LIB通常进行了优化,以保证在大规模场景下也能有良好的计算性能和实时性。 6. **API...

    RVO3050 软件 3.14中文版.rar

    《RVO3050软件3.14中文版——基于LabVIEW的高效工具》 在信息技术领域,软件是至关重要的组成部分,而今天我们要探讨的是名为“RVO3050”的软件,其3.14中文版为用户带来了全新的体验。这款软件专为Windows 95/98...

    RVO3100 软件 3.14中文版.rar

    《RVO3100软件3.14中文版——基于LabVIEW的高效控制系统解析》 RVO3100软件3.14中文版是一款专为自动化控制领域设计的应用程序,它以其强大的功能和易用性在业界享有盛誉。这款软件的核心是基于美国国家仪器公司...

    速度障碍法(RVO、DVO).rar

    速度障碍法(RVO, Reciprocal Velocity Obstacle)与双向速度障碍物(DVO, Dual Velocity Obstacle)是机器人路径规划中的两种重要算法,主要用于解决多智能体避障问题。这两种方法在自主驾驶、无人机导航、机器人...

    RVO2100L 测控软件(汉化版).rar

    RVO2100L_2K Ver1.45c.EXE是该测控软件的安装程序,版本号为1.45c,适用于Windows 2000操作系统。这个版本可能包含了一些性能优化和错误修复,以提升软件的稳定性和可靠性。安装过程中,用户应按照提示进行,确保...

    数字存储示波器(RVO2100)测控软件.rar

    "Rvo2100L Ver1.45c.EXE"是该示波器配套的测控软件,用于远程控制和数据分析,版本1.45c意味着软件经过多次优化,具有更高的稳定性和兼容性。 该测控软件提供用户友好的界面,可实现对示波器的全面控制,包括设置...

    相互速度障碍物_rvo_RVO速度障碍物的计算程序_c#路径障碍物_机器人_路径规划.zip

    这个压缩包文件"相互速度障碍物_rvo_RVO速度障碍物的计算程序_c#路径障碍物_机器人_路径规划.zip"似乎包含了一个C#实现的算法,专门用于解决多机器人系统中的路径规划和避障问题。该算法可能基于RVO(Relative ...

    RVO2-3D:在三个维度上均能最佳地避免相互碰撞(C ++)

    最佳的三维互撞避免 我们提出了一种避免相互碰撞的正式方法,其中多个独立的移动机器人或特工在公共工作空间中移动时,... RVO2-3D库是我们算法的三个方面的开源C ++ 98实现。 它具有用于第三方应用程序的简单API。

    相互速度障碍物_rvo_RVO速度障碍物的计算程序_c#路径障碍物_机器人_路径规划_源码.zip

    在给定的压缩包文件"相互速度障碍物_rvo_RVO速度障碍物的计算程序_c#路径障碍物_机器人_路径规划_源码.zip"中,我们可以深入探讨几个关键的IT知识点,主要涉及机器人路径规划、速度障碍物计算以及C#编程语言的应用。...

    matlabDijkstra +冲击最小的虎鲸(RVO2).zip

    标题中的"matlabDijkstra +冲击最小的虎鲸(RVO2)"揭示了这个压缩包包含的是与MATLAB相关的算法实现,特别是Dijkstra算法和RVO2(Recursive Velocity Obstacles for Two-Agent Navigation)算法,这是一种用于多智能...

    RVO2-3D, 在三维( C ) 中,最佳互冲突避免.zip

    RVO2-3D, 在三维( C ) 中,最佳互冲突避免 三维最优互冲突避免的算法http://gamma.cs.unc.edu/RVO2/ Chapel Hill的版权所有 2008大学在Apache许可以证下许可以证版本 2.0 ("许可以证") ;你可以能不使用这里文件,...

    测试代码RVO优化反汇编代码

    其中,Return Value Optimization (RVO) 是C++编译器提供的一种优化技术,旨在减少不必要的对象复制,特别是在函数返回值时。本篇文章将深入探讨RVO的概念、工作原理以及如何通过反汇编代码来观察和理解RVO的实现。 ...

Global site tag (gtag.js) - Google Analytics