C++中返回之为结构体的分析
这是测试代码,对应的反汇编程序如下图所示:这是main函数的反汇编。其中:
.text:00401048 lea eax,
.text:0040104B push eax
.text:0040104C call sub_401005
是把main函数栈帧中,地址为ebp-0x30(其中var_30为-30)传递给eax,把eax压栈后调用函数sub_401005.也就是test函数,反汇编如下所示:
其中:
mov eax, //获取参数,也就是main函数ebp-0x30处的地址
mov ecx,
mov , ecx //以下是往地址ebp-0x30处的地址复制数据
mov edx,
mov , edx
mov ecx,
mov , ecx
mov edx,
mov , edx
mov eax, //eax保存着缓冲区地址,即ebp-0x30处
再回到main函数:
.text:00401054 mov ecx, //以下是将eax指向的内容复制到main函数地址为ebp-0x20处的临时缓冲区
.text:00401056 mov , ecx
.text:00401059 mov edx,
.text:0040105C mov , edx
.text:0040105F mov ecx,
.text:00401062 mov , ecx
.text:00401065 mov edx,
.text:00401068 mov , edx
.text:0040106B mov eax, //这边是将临时缓冲区的数据拷贝到main函数地址为ebp-0x04处,也就是真正的变量
.text:0040106E mov , eax
.text:00401071 mov ecx,
.text:00401074 mov , ecx
.text:00401077 mov edx,
.text:0040107A mov , edx
.text:0040107D mov eax,
.text:00401080 mov , eax
在main函数中的来回拷贝是因为Debug版本的原因。可见在main函数中条用test()函数有隐性的传进一个参数:即用来接收返回值的临时缓冲区的地址。更进一步说,会发生两次拷贝,并且分配了多余的临时缓冲区空间。既耗时又耗空间!!
以上是个人的分析,第一次发稿多多指教!!!! 看看
页:
[1]