VC++6.0中,返回值为一个结构体时,对象复制2次的问题

来源:互联网 发布:淘宝网上眼镜店哪家好 编辑:程序博客网 时间:2024/05/17 08:49

VC++6.0中,如果返回值较小,则储存在eax中返回,假如较大,如一个结构体,实验如下:

#include<iostream>using namespace std;struct A{int hour;int minute;int second;float day;};A sum(A );int main(){A b;A mon={1,2,3,4.1};sum(mon);cout<<mon.hour<<":"<<mon.minute<<endl;return 0;}A sum(A a){a.hour++;a.mintue++;a.second++;return a;}

main函数的栈中,[EBP-10]~[EBP]是变量b存储空间,[EBP-20]是变量mon的。

调用函数num()时,会把[EBP-40]的地址压入,并且在子函数num()中,把返回值存放到[EBP-40]中,并且把这个地址放入eax中返回

调用结束,返回后,再把[EBP-40]~[EBP-30]处的结构体数据传递给[EBP-30]处,最后传递给变量b中。


也就是说,比起int型的返回值,这个返回的对象被复制了2次:

第一次在子函数中,复制在一个隐藏的参数所指向的空间里(该空间在主函数栈中开辟——[EBP-40]);

第二次在返回后,复制在主函数的栈中——[EBP-30]

即使不把返回值赋给变量b,依旧会进行2次复制,把返回值保存到[EBP-30]处。


为什么要复制2次,并且在主函数销毁之前,显然这两个副本是一直存在的。我不知道。。。期待大能的解惑。。。。

原创粉丝点击