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次,并且在主函数销毁之前,显然这两个副本是一直存在的。我不知道。。。期待大能的解惑。。。。
探讨VC++6.0中结构体作为函数返回值时的数据复制过程及原因。通过实例分析,揭示结构体返回值如何在栈中复制两次,并解释这种机制背后的原因。
852

被折叠的 条评论
为什么被折叠?



