2012年4月20日星期五

值返回和指针返回简说

 
 

satan 通过 Google 阅读器发送给您的内容:

 
 

于 12-4-19 通过 averiany涂鸦馆 作者:averainy

这篇是转载:原文链接
好吧,这是常识,我说快点。

C * c = get_c();
这是指针返回。
C c = get_c():
这是值返回。
指针返回的缺点是,你必须检测返回指针的有效性,也就是NULL。并且,你需要手工管理指针释放。而优点则是避免了值拷贝,还有可以返回空值,即通过返回NULL表示没有值的情况。
而引用返回最大的优势在于,变量的生存周期和作用域相同,你无需管理释放问题。然而缺陷就是庞大的拷贝开销。

在get_c返回的时候,会return一个对象。这个对象是子函数作用域对象(sub function scope),会随着子函数退出而失效。因此,在返回值的时候会引发拷贝。这种拷贝有两种可能。
1. 拷贝构造
当返回值被用于某个对象的声明时,会触发拷贝构造函数。被返回的对象会作为拷贝构造参数传递(引用传递),而拷贝出的对象就是被生成对象。
2. 赋值算子
即operator =。当对某个已经声明对象进行赋值时,会发生这种现象。
当然,近代编译器对于"在返回时进行构造用于返回后的构造"这种情况做了优化,通称RVO优化。例如上文,如果get_c中使用return C(a, b);进行返回,实际上只有C::C(a, b)的调用,而没有C::C(const C & c)的调用。


本文作者:averainy | 本文地址: 固定链接 | 我的腾讯微博|我的google+
本站文章除特殊标明者外均为原创,版权所有,如需转载,请以超链接形式注明作者和原始出处及本声明

相关日志


 
 

可从此处完成的操作:

 
 

没有评论:

发表评论