zoukankan      html  css  js  c++  java
  • return value optimization

    http://en.wikipedia.org/wiki/Return_value_optimization

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

    simple example

    A MyMethod (B &var)
    {
       A retVal;
       retVal.member = var.value + bar(var);
       return retVal;
    }
    

    valA = MyMethod(valB);

    Hidden argument code without NRVO (pseudo code)

    A MyMethod (A &_hiddenArg, B &var)
    {
       A retVal;
       retVal.A::A(); // constructor for retVal
       retVal.member = var.value + bar(var);
       _hiddenArg.A::A(retVal);  // the copy constructor for A
       return;
    retVal.A::~A();  // destructor for retVal
    
    }
    

    Hidden argument code with NRVO (pseudo code)

    A MyMethod(A &_hiddenArg, B &var)
    {
       _hiddenArg.A::A();
       _hiddenArg.member = var.value + bar(var);
       Return
    }

    Code Samples

    Sample 1: Simple example

     

    #include <stdio.h>

    class RVO

    {

    public:

    RVO()

    {

    printf("I am in constructor %d\n", this);

    }

    RVO (const RVO& c_RVO)

    {

    printf ("I am in copy constructor %d\n", this);

    }

    ~RVO()

    {

    printf ("I am in destructor %d\n", this);

    }

    RVO& operator=(const RVO& rhs)

    {

    printf ("I am in operator %d = %d\n", this, &rhs);

    return *this;

    }

    int mem_var;

    };

    RVO MyMethod (int i)

    {

    printf("3\n");

    RVO rvo; //I am in constructor 1244896

    printf("4\n");

    rvo.mem_var = i;

    printf("5\n");

    return (rvo); //1244948CC, ~1244896

    printf("6\n");

    }

    int main()

    {

    printf("1\n");

    RVO rvo; //I am in constructor 1245016

    printf("2\n");

    rvo=MyMethod(5); //I am in copy constructor

    printf("7\n");

    return 0; //~1245016

    }

    Figure 4. Sample1.cpp

    Compiling sample1.cpp with and without NRVO turned on will yield different behavior.

    Without NRVO (cl /Od sample1.cpp), the expected output would be:

    1
    I am in constructor 1245016
    2
    3
    I am in constructor 1244888
    4
    5
    I am in copy constructor 1244944
    I am in destructor 1244888
    I am in operator 1245016 = 1244944
    I am in destructor 1244944
    7
    I am in destructor 1245016

    With NRVO (cl /O2 sample1.cpp), the expected output would be:

    1
    I am in constructor 1245048
    2
    3
    I am in constructor 1245052
    4
    5
    I am in operator 1245048 = 1245052
    I am in destructor 1245052
    7
    I am in destructor 1245048
  • 相关阅读:
    项目总结_写代码
    项目总结_el表达式
    项目总结plc_过滤器规则(filter)_忽略过滤的js和css文件
    tomcat 启动错误
    每天学点java_Eclipse修改author名
    每天学点java_FileOutputSteam类
    每天学点java_File类
    11.28日日记
    《深入理解计算机系统》学习中期
    开始《深入理解计算机系统》
  • 原文地址:https://www.cnblogs.com/cutepig/p/1679015.html
Copyright © 2011-2022 走看看