读书人

老帖重谈~关于引用,该如何解决

发布时间: 2012-06-12 14:21:25 作者: rapoo

老帖重谈~~关于引用
http://topic.csdn.net/u/20100323/16/45af3458-7e29-4632-8fd0-bef584091029.html?seed=1610027196&r=78802780#r_78802780

其中一段话:
{
引用 10 楼 delphiwcdj 的回复:
我的理解是返回type&; 编译器不会再声明一个临时变量,可以提高效率。
int a=Fun();// 此过程只是将Fun的返回值进行一次拷贝,没有用到函数中的局部变量

返回一个对象:系统要生成一个对象的拷贝返回;
返回一个引用:系统直接返回当前对象;

int a=Fun();的确是拷贝Fun的返回值,但Fun返回的是引用,该引用指向Fun函数中定义的局部变量;a在获取值的时候并不是读取一个临时变量,而是直接从Fun里面定义的局部变量的内存中获取。

我看了一下对应的汇编代码,你说的是对的。
当函数原型为int Fun()时,会将返回值mov到寄存器eax中保存,退出Fun后再mov到a中。
当函数原型为int& Fun()时,会将返回值的地址保存在eax中,退出Fun后再通过此地址读取数据到a中。

以前在书上好像读到过,当返回一个对象的时候,如果返回的不是引用,会自动调用构造函数再创建一个临时的对象。我在这里可能存在误解,本以为返回引用可以提高效率。现在得出结论:不要返回局部变量的引用。

等会儿结贴,谢谢大家!
}

我认为这样可以啊~提高了效率,不是么?


[解决办法]
http://blog.csdn.net/darkbus111/article/details/6675092
这位大侠这篇文章里有说一些注意事项 就有一个 不能返回局部变量的引用
[解决办法]
按我理解的话,引用只是一个别名,
也就是说,当出了定义的函数范围时,局部变量的本尊就被销毁了.这时候你再使用别名就出错了.
而传别名参进子函数的时,别名的本尊在父函数内还在生存期,所以能传别名参.
应该就是这样吧,
不知道我说的对不对,请大牛拍砖.

读书人网 >C++

热点推荐