关于《Inside The C++ Object Model》中NRV(Named Return Value)优化的问题。

xuwedo2003 2004-04-29 05:06:47
本人现正在研读《Inside The C++ Object Model》当读到P66 NRV优化时,从书中可以得出以下结论:要想激活NRV优化必须得提供拷贝构造函数!我百思不得其解。希望有熟悉这方面的高人们给以指点。
为方面大家回答,先把原书中的例子给大家:
X为一个类:
X bar()
{
X xx;

//处理xx.........

return xx;
}

通过NRV优化则是把以上代码改变为以下形式,编译器把其中的xx以_result取代:
void bar( X & _result)
{
_result.X:X(); //调用X类的默认构造函数,初始化_result

//处理_result.......

return; //直接返回
}
这就是所谓的NRV优化,但俺从中看不出任何地方调用了什么拷贝构造函数。希望哪位看过此书的高人们能给解答一下?
...全文
100 13 点赞 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xuwedo2003 2004-05-13
以下是Jinhao(辣子鸡丁)的解释:确实拷贝构造函数是起一个开关作用。如果没有提供拷贝构造函数,那做优化就没有任何意义,因为编译器[自动插入的拷贝构造函数]在大多数情况下效率会比[用户提供的拷贝构造函数]高~~NRV并不是语言的一部分,只是编译器提供的优化,当存在用户定义的copy ctor时,就可以做NRV优化,反之,不用。
下面的测试的代码:

#include <iostream>
using namespace std;

class A{
public:A(){}
public:A(const A&){
cout<<"Copy constructor"<<endl;
}
};

A fun(){
A a;
return a;
}
/*
NRV优化后的结果:
void fun(A & _result)
{
_result.A:A();
return;
}
*/
int main(){
A a=fun();
system("pause");
return 0;
}
测试结果:
请按任意键继续 . . .

可见跟本没有什么拷贝构造构数被调用。
经历了这么多天,终于搞明白了这个问题。。。。。。
在C++学习的长途中,这样的问题还有很多,你准备好了没有?
  • 打赏
  • 举报
回复
xuwedo2003 2004-05-13
chenqing1128(cq) 兄不见NRV(Named Return Value)优化后的代码吗?优化后之代码何处有拷贝构造函数之调用?书中多次提到:“要想激活NRV优化必须得提供拷贝构造函数!”,依我看,没有拷贝构造函数也可以进行NRV优化。因为优化后的代码不用调用拷贝构造函数。
  • 打赏
  • 举报
回复
xuwedo2003 2004-04-30
用reference 传递参数当然比传值要快。不过我觉得现在是学习知识,而不是在应服,所以最好把这个问题搞清楚才好。再者,此书的经典性不容置疑,在此书中有几处都用到了NRV优化,所以还是请哪位看过或对NRV优化比较熟的朋友给解答一下。谢谢。
  • 打赏
  • 举报
回复
chenqing1128 2004-04-30
补充:
1)直接赋值,型如a=b,(a和b都是X类的实例) 调用了拷贝构造函数。
型如X a=b的除外,他调用的是构造函数。
2)作为函数参数传值。如调用函数func(X a)时,
X b;
func(b);
会出现将b---->临时变量a
3)作为函数返回值。如楼主的代码
  • 打赏
  • 举报
回复
ToIP 2004-04-30
搞不懂先放着,我C++理论基础薄弱,解释不了,但是我都用reference传递参数,觉得可能快点,还不需要提供拷贝构造函数或者使用bit方式得缺省拷贝构造函数
  • 打赏
  • 举报
回复
chenqing1128 2004-04-30
return xx;----->>这句调用了拷贝构造函数。
调用了拷贝构造函数的情况:
1)直接赋值,型如a=b,(a和b都是X类的实例) 调用了拷贝构造函数。
型如X a=b的除外,他调用的是构造函数。
2)作为函数参数传值。
3)作为函数返回值。
  • 打赏
  • 举报
回复
angelo23 2004-04-30
http://expert.csdn.net/Expert/TopicView3.asp?id=2997244
http://expert.csdn.net/Expert/TopicView3.asp?id=2894275
  • 打赏
  • 举报
回复
xuwedo2003 2004-04-30
没有人回答吗?现在我已经读到第四章(The semantics of function),现在又出现了NRV的优化,并且书中再次提出NRV优化需要copy constructor,还是不明白,希望有读过这本书的高手们能给解答一下?昨天在公交车上想了大半天,还是想不出NRV优化在哪儿调用copy constructor???????????????????????????
  • 打赏
  • 举报
回复
xuwedo2003 2004-04-30
呵呵,多谢zf0579(楚风萧萧) 兄的帮助,但是汇编这东东,俺现在实在是用得不是很好呀。实在不行,五一俺恶补一下?
OK就这么定了!
不过还是有高手给俺说一下最好。
  • 打赏
  • 举报
回复
zf0579 2004-04-30
It is very easy to make a example to test this function.
make a class include the copy constructor, then look the assemble code.
comment the copy constructor, look the assemble code again.
you will find if copy constructor existed, the copy constructor will be call.
else not.
so if you don't see where call the copy constructor, maybe the book does not express it well.

  • 打赏
  • 举报
回复
dnnupt 2004-04-29
mk
  • 打赏
  • 举报
回复
xuwedo2003 2004-04-29
我也知道这样可以省略生成临时变量,但,你没有回答我“什么地方调用了什么拷贝构造函数”这个问题呀。你看该书中对的例子中说,因为缺少一个拷贝构造函数所以不能激活NRV呀。

我看的是候捷的译本。谢谢。
  • 打赏
  • 举报
回复
zf0579 2004-04-29
老大 你看的是翻译本吧

//处理_result....
原书中是
//...process in _result directly
直接在_result中处理,这样省略生成临时变量达到优化效果
我是这样理解的 :)
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2004-04-29 05:06
社区公告
暂无公告