关于返回结构体的函数

关于返回结构体的函数

ID:20841415

大小:55.72 KB

页数:4页

时间:2018-10-17

关于返回结构体的函数_第1页
关于返回结构体的函数_第2页
关于返回结构体的函数_第3页
关于返回结构体的函数_第4页
资源描述:

《关于返回结构体的函数》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、(一)不超过8bytes的小结构体可以通过EDX:EAX返回。本文的范例代码取材于《汇编中函数返回结构体的方法》一文,并在此基础上进行修改和试验。要研究的第一份代码如下,定义一个不超过8bytes的小结构体,不超过8bytes是因为这个结构体能够用EDXzEAX容纳,我们之后将看到在release编译时,编译器能够向返回普通基础类型那样进行返回。ttinclude//不超过8bytes的“小结构体”structA{inta;intb;};//返回结构体的函数structAadd(intx,inty){structAt;t

2、.a=x氺y;returnt;}intmain(){structAt=add(3,4);printf(/zt.a=%ldrT,t.a);return0;首先,我们需要解决一个常见困惑,就是耍明确这段代码和下面的典型错误代码的区别:char*get_buffer()charbuf[8];returnbut;上面的get_buffer返回的是栈上的临时变量空间,在函数返回后,其所在的空间也就被“回收/释放”了,也就是说函数返回的地址位丁栈的增长方向上,是不稳定和不被保证的。那么返回结构体的函数则不同,你可以发现返回结构体的函数是工作正常有效

3、的。在add函数中有一个临时性结构体t,毫无疑问,t将在add函数返回时被释放,似由于t被当做“值”进行返回,闵此编译器将保证add的返回值对于add的调用者(caller)来说是有效的。另外需要明确的一点是,我个人觉得,现实里这种返回结构体的方式比较少见,后面将会看到这样做会产生临时对象和多余拷贝过程,效率不高。常见方法是传递结构体指针。但作为语言上允许的方式,有必要弄清楚编译器如何实现这种方式,而耍弄清楚这个问题,需耍查看汇编代码。使用VC6输入上述代码,下面分别给出其汇编代码。(1)debug版本,汇编代码如下。Esmall_str

4、uct_debug下面是实现方式的栈示意阁:低地址add函数:tebpebp保存值返回地址栈增长方向临时对象main函数:ebpebp保存值髙地址总结:(1.1)用edxzeax传递返回值。调用方不需要在栈上向add函数传递接受返回值的地址。(2.2)debug版本在调用方生成临时对象返回值,然后再把临时对象拷災到main临时变量所在地址。效率低。(2)release版本,汇编代码如下:Esmall_struct_release总结:(2.1)同(1.1),用edxzeax传递返回值,不需要传递接收返回值的地址。(2.2)release版

5、本调用方没有临时对象,效率基本等同于传结构体指针。(2.3)release版本优化的太厉害,甚至都没有把返回值完整的拷贝到临时变量t(只拷贝了结构体中的成员t.b,t.a的拷贝被认为没有存在价值而被优化掉了,因为t.a的值存于eax),和高级语言有较大差别。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。