- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于返回结构体的函数 【前言】写作本文,源于最近回复的《汇编中函数返回结构体的方法》?一文。在网络上也已经有一些相关文章和相关问题,有的文章已经给出了一部分结果,但总体而言还缺少比较重要的结论。本文以分析 VC6 编译器,32 位架构为主来重复性分析这个话题。? (一)不超过 8 bytes 的小结构体可以通过 EDX:EAX 返回。 本文的范例代码取材于《汇编中函数返回结构体的方法》一文,并在此基础上进行修改和试验。要研究的第一份代码如下,定义一个不超过 8 bytes 的小结构体,不超过 8 bytes 是因为这个结构体能够用 EDX:EAX 容纳,我们之后将看到在 release 编译时,编译器能够向返回普通基础类型那样进行返回。?#include stdio.h//不超过 8 bytes 的“小结构体”struct A{int a;int b;};//返回结构体的函数struct A add(int x, int y){struct A t;t.a = x * y;return t;}int main(){struct A t = add(3, 4);printf(t.a = %ld\n, t.a);return0;}? 首先,我们需要解决一个常见困惑,就是要明确这段代码和下面的典型错误代码的区别: char* get_buffer() { char buf[8]; return buf; } 上面的get_buffer返回的是栈上的临时变量空间,在函数返回后,其所在的空间也就被“回收/释放”了,也就是说函数返回的地址位于栈的增长方向上,是不稳定和不被保证的。 那么返回结构体的函数则不同,你可以发现返回结构体的函数是工作正常有效的。在 add 函数中有一个临时性结构体 t,毫无疑问,t 将在 add 函数返回时被释放,但由于 t 被当做“值”进行返回,因此编译器将保证 add 的返回值对于 add 的调用者(caller)来说是有效的。? 另外需要明确的一点是,我个人觉得,现实里这种返回结构体的方式比较少见,后面将会看到这样做会产生临时对象和多余拷贝过程,效率不高。常见方法是传递结构体指针。但作为语言上允许的方式,有必要弄清楚编译器如何实现这种方式,而要弄清楚这个问题,需要查看汇编代码。使用 VC6 输入上述代码,下面分别给出其汇编代码。? (1)debug 版本,汇编代码如下。?small_struct_debug.textdd proc near ; CODE XREF: j_addj.texttextvar_48 = dwordptr -48h.textvar_8 = dwordptr -8.textvar_4 = dwordptr -4.textarg_0 = dwordptr8.textarg_4 = dwordptr 0Ch.texttextushebp.textovebp, esp.textubesp, 48h.textushebx.textushesi.textushedi.texteaedi, [ebp+var_48].text:0040102Cmovecx, 12h.textoveax, 0CCCCCCCCh.textepstosd.textoveax, [ebp+arg_0].text:0040103Bimuleax, [ebp+arg_4].text:0040103Fmov [ebp+var_8], eax.textoveax, [ebp+var_8].textovedx, [ebp+var_4].textopedi.textopesi.text:0040104Apopebx.text:0040104Bmovesp, ebp.text:0040104Dpopebp.text:0040104Eretn.text:0040104Eaddendp.text:0040104E.text:0040104E; 哪哪哪哪哪哪哪哪哪哪哪哪
您可能关注的文档
最近下载
- 2025年酒店筹建提供顾问服务合同.pdf VIP
- 高考语文古代诗歌阅读分类训练:哲理类(含解析).docx VIP
- 天津市2023-2024学年高二上学期物理期中考试试卷(含答案).pdf VIP
- 智茂GAM330 GAM320编程基本操作.ppt VIP
- HGT3737-2018 厌氧胶粘剂行业标准.pdf VIP
- 《2025年四川省事业单位招聘考试综合类公共基础知识真题试卷》真题题库.docx VIP
- 2024-2025学年河南省郑州四中八年级(上)期中数学试卷.pdf VIP
- 雾灵山阿那亚国家级休闲康养旅游度假区总体规划.pptx
- 三查四定设备篇.ppt VIP
- 传统文化的现代设计.pptx
原创力文档


文档评论(0)