打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
函数返回值在那里?
这个函数的返回值在那里的问题。
给一个简单的函数
int fn(int a);
ing fn(a){
int ntmp;
ntmp=a+1;
return ntmp;
}
应该是在CPU的那个寄存器中呢?还是内存的那个位置?
如果我用一下 fn(100);
那我怎么知道去哪里找返回值呢??


int fn(int a);
======================
函数return时,把返回值放在寄存器EAX中。


如果程序中需要用到int fn(int a);的返回值,如:int i =  fn(100);
那么在函数返回后,将累加器EAX中的值,存入变量i。

你去看看你的编译器编译出来汇编代码,就知道,返回值在EAX里面了。
还有,如果是16位的机器中,应该是在AX中


X86的机器 小于等于1个字时放在 EAX 中,大于一个机器字小于等于2个字的放在 EDX:EAX中,大于2个字的在栈上开辟一段临时的空间存放返回值,浮点数类型的返回值放在ST0中。
    ARM的是返回值放在RO中,其他的机器还没怎么用过。


int result = fn(100);
这样就保存到result变量中去了。


这要看具体编译器的设计。对于简单的而且小的返回值,一般放在寄存器,对于复杂的对象
作为返回值的时候,一般通过函数调用栈找到返回值的地址,然后写该地址.
记得thinking in c++ volume 1中说得很清楚的


这个看你编译器的实现了啊
vc是放在EAX寄存器中
这个你看一下汇编代码就知道了啊,


至于函数的返回值在那里,这要由编译器根据返回值的类型和具体的调用情况等等因素来决定。幸好对函数的使用者来说,他不需要知道具体的存放位置就可以使用返回值。
再回到题目上来。对于楼主提供的这个fn()函数来说,它的返回是一个int型数。这种情况下一般的处理就是放到寄存器中;但并不总是这样,因为还可能跟调用情况有关。例如下面的例子:
const int& ri = fn(100);
ri是函数返回对象(int型)的常量引用。由于被引用,函数返回对象的生存期得到了延长。显然这种情况下这个函数的返回值就不能始终放在寄存器中了;这时,编译器一般会采取另一种策略:在内存中创建一个无名的临时对象来保存函数的返回值。
以上想法没有经过确认。是不是这样,请大家验证。

按约定,都是放在eax中,如果不按约定放在任何能放数据的地方都可以

const int& ri = fn(100);
===================================
这种是需要使用返回值的情况,函数返回后,从寄存器中取出数据,放到内存中(产生临时变量),由
ri引用。
返回值在寄存器只是临时的存放,即从被调函数的return开始,到返回调用处。
函数返回后,返回值必须马上转移到内存(或者丢弃),因为寄存器要用来执行指令。


在VC中,应该是放在EAX寄存器中

另外补充一个,C++允许给const引用绑定临时对象。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
volatile关键字
C语言函数调用栈(二)
调用约定
for 循环和while循环区别
C++中虚函数的原理及实现
利用模板元编程实现解循环优化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服