鱼C论坛

 找回密码
 立即注册
查看: 2559|回复: 1

[技术交流] C++中返回之为结构体的分析

[复制链接]
发表于 2015-8-7 12:55:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

这是测试代码

这是测试代码
这是测试代码,对应的反汇编程序如下图所示:这是main函数的反汇编

这是main函数的反汇编

这是main函数的反汇编
。  
其中:
.text:00401048                 lea     eax, [ebp+var_30]
.text:0040104B                 push    eax
.text:0040104C                 call    sub_401005

是把main函数栈帧中,地址为ebp-0x30(其中var_30为-30)传递给eax,把eax压栈后调用函数sub_401005.也就是test函数,反汇编如下所示:
QQ图片20150807123754.jpg

其中:
mov     eax, [ebp+arg_0]   //获取参数,也就是main函数ebp-0x30处的地址
   mov     ecx, [ebp+var_10]
   mov     [eax], ecx            //以下是往地址ebp-0x30处的地址复制数据
   mov     edx, [ebp+var_C]
   mov     [eax+4], edx
   mov     ecx, [ebp+var_8]
   mov     [eax+8], ecx
   mov     edx, [ebp+var_4]
   mov     [eax+0Ch], edx
   mov     eax, [ebp+arg_0]  //eax保存着缓冲区地址,即ebp-0x30处

再回到main函数:
.text:00401054                 mov     ecx, [eax]    //以下是将eax指向的内容复制到main函数地址为ebp-0x20处的临时缓冲区
.text:00401056                 mov     [ebp+var_20], ecx
.text:00401059                 mov     edx, [eax+4]
.text:0040105C                 mov     [ebp+var_1C], edx
.text:0040105F                 mov     ecx, [eax+8]
.text:00401062                 mov     [ebp+var_18], ecx
.text:00401065                 mov     edx, [eax+0Ch]
.text:00401068                 mov     [ebp+var_14], edx

.text:0040106B                 mov     eax, [ebp+var_20]   //这边是将临时缓冲区的数据拷贝到main函数地址为ebp-0x04处,也就是真正的变量                                                                                                                                                                                       
.text:0040106E                 mov     [ebp+var_10], eax
.text:00401071                 mov     ecx, [ebp+var_1C]
.text:00401074                 mov     [ebp+var_C], ecx
.text:00401077                 mov     edx, [ebp+var_18]
.text:0040107A                 mov     [ebp+var_8], edx
.text:0040107D                 mov     eax, [ebp+var_14]
.text:00401080                 mov     [ebp+var_4], eax

在main函数中的来回拷贝是因为Debug版本的原因。可见在main函数中条用test()函数有隐性的传进一个参数:即用来接收返回值的临时缓冲区的地址。更进一步说,会发生两次拷贝,并且分配了多余的临时缓冲区空间。既耗时又耗空间!!

以上是个人的分析,第一次发稿多多指教!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-12 01:04:38 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 08:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表