+ -
当前位置:首页 → 问答吧 → 函数返回值存在哪里

函数返回值存在哪里

时间:2011-12-12

来源:互联网

今天被人问这个问题,被鄙视掉了。

话说函数内部的变量都是存在栈里,那按理说函数结束后,变量生命周期就结束了,为什么返回值还在?

这么多年了还没搞清这个问题,实在惭愧。。。。。。平时的学习太肤浅太浮夸了。。。。。

作者: zero_226   发布时间: 2011-12-12

寄存器或者栈上。
比如小于4个字节的返回值对象,vc会放入eax

作者: Demon__Hunter   发布时间: 2011-12-12

有时候用寄存器返回。
有时候增加一个返回值地址作为参数,然后在那里构造返回值。
 刚刚看了一下调用约定的说明,好像没有说到返回值的问题。
这个取决于编译器的实现吧。如果是我写编译器的话,可能会把返回值放在堆栈顶部。

作者: mingliang1212   发布时间: 2011-12-12

引用 1 楼 demon__hunter 的回复:

寄存器或者栈上。
比如小于4个字节的返回值对象,vc会放入eax

放在栈上的话,难道不是函数调用结束后就清空?生命周期是结束了的呀

作者: zero_226   发布时间: 2011-12-12

放在eax寄存器里

作者: qscool1987   发布时间: 2011-12-12

引用 3 楼 zero_226 的回复:放在栈上的话,难道不是函数调用结束后就清空?生命周期是结束了的呀


c++其实不涉及栈(不是STL那个栈)的概念,局部变量是不是要放在栈上,标准可没规定

作者: yisikaipu   发布时间: 2011-12-12

引用 5 楼 yisikaipu 的回复:引用 3 楼 zero_226 的回复:放在栈上的话,难道不是函数调用结束后就清空?生命周期是结束了的呀

c++其实不涉及栈(不是STL那个栈)的概念,局部变量是不是要放在栈上,标准可没规定


补充一下,异常处理部分有栈展开的概念

作者: yisikaipu   发布时间: 2011-12-12

引用 3 楼 zero_226 的回复:

放在栈上的话,难道不是函数调用结束后就清空?生命周期是结束了的呀




首先纠正你一个误解。函数调用完堆栈不是清空了。而是将函数内的局部变量析构了。

2楼已经说了,只要在调用函数处分配一个足够返回值大小的空间,然后再把这个空间的地址传给函数,作为返回值使用。相当于是在调用函数的地方多了一个临时变量而已。

作者: mingliang1212   发布时间: 2011-12-12

同不知。

作者: BeTalker   发布时间: 2011-12-12