return value optimization

本文通过一个简单的示例详细解释了返回值优化(NRVO)的概念及其在C++中的实现方式。对比开启与关闭NRVO的情况,展示了NRVO如何减少对象复制,提高程序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值