大家来探讨一下这个问题,return的效率

snowx 2004-07-20 03:04:18
读了林锐博士的 高质量C++_C编程指南
其中说到
return int(x+y); //创建临时对象

int temp = x + y;
return temp; //创建局部对象

“编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了效率”

我知道,调用这个返回值的函数,一般有个对象赋值的调用
b = fun();
如何理解这个临时对象初始化在外部存储单元?函数执行完,如何能跳过赋值 = 直接对b初始化赋值?不需要拷贝过程了吗?

请大家给点意见
...全文
192 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
conquers 2004-07-21
  • 打赏
  • 举报
回复
看了各位的帖子真是长见识啊,佩服佩服
xmlhb 2004-07-20
  • 打赏
  • 举报
回复
我认为两个效率是一样的,因为编译器会进行RVO(返回值优化),more effective c++上有讲。
sssqin(木棉道),不能返回一个引用,引用指向一个临时对象是错误的。
whyglinux 2004-07-20
  • 打赏
  • 举报
回复
>> 实质上 零时对象 不论如何都要单独创建出来的
>> 而赋值过程也是必不可少的,是吗?

上述说法不太正确。比如,当函数返回引用的情况。

>> 这里说的 外部存储单元,应该是说的零时对象 的存储单元吧。而如果用temp中间变量,就还多了一个过程,通过中间变量赋值给零时对象。

前半部分说得正确。要注意的是这个临时对象的生存期很短,仅限于函数调用语句这个范围。

后半句不对:给临时对象赋值(或初始化)这个过程在两种方法中都是不可避免的,多出的y应该是对 temp 这个中间变量赋值的过程。
wangyamin 2004-07-20
  • 打赏
  • 举报
回复
其实代码最后是汇编。

return a; mov eax,a

b = fun(); mov b ,eax

所以
return int(x+y); mov eax,x
add eax,y


int temp = x + y; mov eax ,x
add eax ,y
mov temp,eax

return temp; mov eax,temp

当然,关键看编译器,它会优化的,最后变怎么样就不知道拉
snowx 2004-07-20
  • 打赏
  • 举报
回复
whyglinux(山青水秀)
嗯,你说的正是我困惑的地方了

实质上 零时对象 不论如何都要单独创建出来的
而赋值过程也是必不可少的,是吗?
b = fun();
“编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了效率”
这里说的 外部存储单元,应该是说的零时对象 的存储单元吧。而如果用temp中间变量,就还多了一个过程,通过中间变量赋值给零时对象。
whyglinux 2004-07-20
  • 打赏
  • 举报
回复
如果是下面这种形式的返回:
int temp = x + y;
return temp; //创建局部对象

则它进行的步骤有:
int temp = x + y; // 计算 x + y 的值,用这个结果初始化 temp(拷贝一次)
return temp; // 创建临时返回对象,用 temp 初始化此对象(拷贝一次)

如果是这样:
return int(x+y); //创建临时对象

则需要的步骤有:
return int(x+y); // 计算 x+ y 的值,创建临时返回对象,用 x + y 的值初始化此临时对象。由于int(x+y);本身就是一个临时对象,所以如果将其作为返回值返回的话编译器会直接将其返回,不再额外创建另外的临时对象。

通过上面的分析,可以看出后者( return int(x+y);)至少省略了一次拷贝操作,所以效率较前者为高。
BluntBlade 2004-07-20
  • 打赏
  • 举报
回复
NRV

Named Return Value.

编译器会在参数列表中隐式插入一个引用参数。
antijpn 2004-07-20
  • 打赏
  • 举报
回复
返回大型对象的时候,有时编译器会偷偷产生引用,返回的就是引用,省去构造对象/析构的过程。这个操作叫做命名返回优化,E文叫NRx(x记不得是什么什么玩意儿了)
qwertasdfg123 2004-07-20
  • 打赏
  • 举报
回复
看thinking in c++ (第一版) P211.
说的很清楚的。
snowx 2004-07-20
  • 打赏
  • 举报
回复
是否是可以跳开函数的return
直接 b = int(x + y)?
BluntBlade 2004-07-20
  • 打赏
  • 举报
回复
如果temp是用户定义类型的话,最好使用
return T(x+y);
的形式。
wfu 2004-07-20
  • 打赏
  • 举报
回复
up
sssqin 2004-07-20
  • 打赏
  • 举报
回复
可以返回一个引用

它不需要创建临时变量
fireseed 2004-07-20
  • 打赏
  • 举报
回复
编译器处理好了,你不用管啦

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧