美文网首页
C++返回值优化(RVO)

C++返回值优化(RVO)

作者: Magic11 | 来源:发表于2019-12-11 13:07 被阅读0次
RVO是C++在处理一个函数返回类对象并将返回值赋给另一个对象时,为了减少拷贝构造次数以及析构次数而采用的一种编译器优化技术。

如下一段代码:

#include <iostream>

using namespace std;

int g_construct_count = 0;
int g_copy_construct_count = 0;
int g_destruct_count = 0;

struct Widget
{
    Widget(){
        cout << "construct count:" << ++g_construct_count << endl;
    }

    Widget(const Widget& widget){
        cout << "copy construct count:" << ++g_copy_construct_count << endl;
    }

    ~Widget() {
        cout << "destruct count: " << ++g_destruct_count << endl;
    }
};

Widget getWidget() {
    Widget w;
    return w;
}

int main() {
    Widget widget = getWidget();

    return 0;
}

下面分别看一下上述代码在g++和vs2013上的运行结果
1)g++在关闭RVO的情况下

@ubuntu:~/work/test/rvo-test$ g++ rvo.cpp -o rvo -fno-elide-constructors
@ubuntu:~/work/test/rvo-test$ ./rvo
construct count:1               //首先在getWidget函数中创建w对象,调用一次构造函数
copy construct count:1          //通过w对象创建一个临时的返回值对象temp,调用一次拷贝构造函数
destruct count: 1               //释放w对象
copy construct count:2          //通过临时的对象temp创建widget对象,调用一次拷贝构造函数
destruct count: 2               //释放临时对象temp
destruct count: 3               //释放对象widget

2)g++在不关闭RVO的情况下(默认是不关闭的)

@ubuntu:~/work/test/rvo-test$ g++ rvo.cpp -o rvo
@ubuntu:~/work/test/rvo-test$ ./rvo
construct count:1
destruct count: 1

在vs下代码调用略有差异

void test() {
    Widget widget = getWidget();
}

int main() {

    test();

    getchar();
    return 0;
}

3)vs2013在debug情况下的运行结果

construct count:1
copy construct count:1
destruct count: 1
destruct count: 2

4)vs2013在release情况下的运行结果

construct count:1
destruct count: 1

vs2013 debug模式下对应的伪代码如下:

void getWidget(const Widget &result)
{
    Widget w;                   //创建w对象
    result(w);                  //用w对象拷贝构造result对象;
    w.Widget::~Widget();        //w对象析构
    return;
}

若将getWidget函数修改为

Widget getWidget() {
    return Widget();
}

则vs2013在debug模式下的运行结果如下:

construct count:1
destruct count: 1

其对应的伪代码如下:

void getWidget(const Widget &result)
{
    result();             
    return;
}

NRVO模式则能将如下代码:

Widget getWidget() {
    Widget w;
    return w;
}

优化成上述伪代码形势
参考:
https://blog.csdn.net/rlyhaha/article/details/80381170
http://www.voidcn.com/article/p-nughucjy-bga.html

相关文章

  • C++之返回值优化

    返回值优化(Return value optimization,缩写为RVO)是C++的一项编译优化技术。它最大的...

  • C++返回值优化(RVO)

    RVO是C++在处理一个函数返回类对象并将返回值赋给另一个对象时,为了减少拷贝构造次数以及析构次数而采用的一种编译...

  • C++之RVO返回值优化

    什么是RVO优化 RVO的全称是Return Value Optimization。RVO是一种编译器优化技术,可...

  • C++ RVO

    刷知乎的时候看到这个问题,C++函数返回值拷贝问题?,觉得有趣,因此写了这篇博客。 函数如何返回值 函数返回值的传...

  • C++编译优化笔记

    本文是我在阅读文献或者代码中,关于编译优化的一些简单笔记。 RVO:即Return Value Optimizat...

  • 强化学习链接

    2019-01-19 避碰算法 RVO多目标避碰算法python RVOpython RVO2 强化学习框架 op...

  • C++ copy elision and return valu

    复制省略和返回值优化 复制省略和返回值优化是编译器可能存在的优化机制。今天在测试右值没有std::move的时候是...

  • C/C++ 返回值、参数列表、缺省等区别

    一、返回值 C中:如果函数未指定返回值类型,则默认为int C++中:如果一个函数没有返回值,返回值类型必须指定为...

  • 深入理解C++中的RVO

    前言 考虑存在这样一个类如HeavyObject,其拷贝赋值操作比较耗时,通常你在使用函数返回这个类的一个对象时会...

  • 深入理解 C++中的 RVO

    前言 考虑存在这样一个类如HeavyObject,其拷贝赋值操作比较耗时,通常你在使用函数返回这个类的一个对象时会...

网友评论

      本文标题:C++返回值优化(RVO)

      本文链接:https://www.haomeiwen.com/subject/ihkogctx.html