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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值