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次,并且在主函数销毁之前,显然这两个副本是一直存在的。我不知道。。。期待大能的解惑。。。。