zoukankan      html  css  js  c++  java
  • Named Return Value Optimization

    返回值在编译器中如何实现


    【实现模型1】cfont的实现采用了双阶段转化。1.首先声明一个额外的参数,类型上类对象的引用,用来存放返回结果。2.对这个参数利用返回值进行拷贝初始化。过程类似于参数传递,也是要定义一个临时对象,用来保存返回值,然后在函数内部调用拷贝构造函数用那个return值进行初始化。

    X bar()
    {
       X xx;
       // process xx ...
       return xx;
    }

    编译器转化后

    // function transformation to reflect
    // application of copy constructor
    // Pseudo C++ Code
    void bar( X& __result )
    {
       X xx;
     
       // compiler generated invocation
     
       
    // of default constructor
     
       xx.X::X();
     
       // ... process xx
     
       
    // compiler generated invocation
     
       
    // of copy constructor
     
       __result.X::X( xx );
     
       return;
     
    }

    【实现模型2】Named Return Value (NRV) optimization,具名返回值优化,实现这种优化有个前提,就是必须提供copy constructor,因为NRV优化的目的就是为了剔除copy constructor的使用。只有有了才能被剔除,否则谈不上剔除。一般的如果不优化NRV,其实现就是类似于模型1中的过程,而实现了优化的过程则上这样的。

    X bar()
    {
       X xx;
       // ... process xx
       return xx;
    }
    //__result is substituted for xx by the compiler:
    void bar( X &__result )
    {
     
       // default constructor invocation
     
       
    // Pseudo C++ Code
     
       __result.X::X();
     
       // ... process in __result directly
     
       return;
     

    是否需要拷贝构造函数呢?

    【注意】一方面要考虑默认的语义是否符合我们的需要。另一方面如果对象面临大量的拷贝操作[ 比如这个class的object需要经常以传值的方式返回],有必要实现一个拷贝构造函数以支持NRV优化。但是如果想使用底层的memcpy之类的直接进行bit wise copy,注意是否真的是bit wise copy拷贝,比如如果是virtual,这样可能破坏调vptr。

    Named Return value 优化:

    NRV优化的本质是优化掉拷贝构造函数。在实现模型1中我们看到了,返回对象的实现总是先对某个对象进行操作,操作完成后,使用Copy Constructor将操作后的对象内容复制到另外一个对象中,然后返回。 基于这样一个前提,NRV可以调用Copy Constructor这一步被省掉。所以NRV的前提必须要有Copy Constructor。

    NRV也有副作用,就是Copy Constructor中的代码不会被执行。

    Reference

    1. http://msdn.microsoft.com/en-us/library/ms364057(VS.80).aspx#nrvo_cpp05_topic4

    2. http://duanple.blog.163.com/blog/static/7097176720094532219778/

  • 相关阅读:
    字符串-串的最大表示-后缀数组-1163. 按字典序排在最后的子串
    动态规划-买卖股票的最佳时机 V
    贪心-到达终点数字
    贪心-优先队列-模拟-任务调度器
    滑动窗口-区间统计
    快速排序-无序数组K小元素
    POJ 2299 Ultra-QuickSort【树状数组 ,逆序数】
    POJ 2976 Dropping tests【二分 最大化平均值】
    POJ 1064 Cable master 【二分答案】
    POJ 3190 Stall Reservations 【贪心 优先队列】
  • 原文地址:https://www.cnblogs.com/whyandinside/p/2497295.html
Copyright © 2011-2022 走看看