jmuxiaolu 发表于 2015-8-7 12:55:46

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()函数有隐性的传进一个参数:即用来接收返回值的临时缓冲区的地址。更进一步说,会发生两次拷贝,并且分配了多余的临时缓冲区空间。既耗时又耗空间!!

以上是个人的分析,第一次发稿多多指教!!!!

自古天道酬勤 发表于 2016-2-12 01:04:38

看看
页: [1]
查看完整版本: C++中返回之为结构体的分析