[发明专利]用于函数调用的方法和装置有效
申请号: | 201210500365.1 | 申请日: | 2012-11-29 |
公开(公告)号: | CN103853532B | 公开(公告)日: | 2017-09-29 |
发明(设计)人: | 官孝峰;郭久福;蒋健;朱鸿伟 | 申请(专利权)人: | 国际商业机器公司 |
主分类号: | G06F9/44 | 分类号: | G06F9/44 |
代理公司: | 北京市中咨律师事务所11247 | 代理人: | 周良玉,于静 |
地址: | 美国*** | 国省代码: | 暂无信息 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 用于 函数 调用 方法 装置 | ||
技术领域
本发明涉及程序中的函数调用,更具体而言,涉及一种用于函数调用的方法和装置。
背景技术
多数高级程序语言都提供有函数调用的功能。在函数调用过程中,调用方和被调用方需要遵从预定的调用约定(Calling Convention)。具体地,调用约定是指在程序设计语言中为了实现函数调用而建立的一种协议。这种协议规定了在调用过程中的多种操作方式,包括,参数如何传送、参数是否可变、由谁来清理堆栈等。不同的语言、不同的编译器定义了不同的调用约定。例如,VC++6.0定义了下面几种调用约定。
__cdecl是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由函数调用方(caller)把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。
__stdcall调用约定用于调用Win32API函数。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,函数的被调用方(callee)在返回前清理传送参数的栈。在该调用约定下,函数参数个数固定。
__fastcall约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。
在其他程序语言中,相应地定义有不同的调用约定。例如,PASCAL是Pascal语言的函数调用方式,也可以在C/C++中使用。在该调用约定下,参数压栈顺序为从左到右,与__cdecl和__stdcall相反。返回时的清栈方式与_stdcall相同。
不同的调用约定应用于不同的语言和不同的需要。一般来说,通过寄存器传递参数有利于提高程序运行时的性能。但是,如果将过多的参数通过寄存器进行传递也会影响执行性能,因为编译器无法在单个函数中完全利用所有的硬件寄存器。因此,在应用中,通常为不同函数选择不同的调用约定来优化性能。例如,不同的函数库可能采用不同的调用约定。此外,不同的编译器对于不同的调用约定也有其选择偏好。例如,一些编译器倾向于通过通用寄存器来传递复数参数,而另一些编译器倾向于通过浮点寄存器传递复数。
多种不同的调用约定为用户的使用带来一定的困恼。如果在进行函数调用时,调用方和被调用方采用了不同的调用约定,将会导致严重的运行时错误。为了避免这样的错误,一种可能的解决方案是由用户处理每个要调用的函数。这就需要用户获得相应的头文件、源代码等。这样的方案使得用户的工作变得非常繁重,并且在许多情况下甚至是无法实现的。另一种可能的方案是要求所有的函数库提供者使用相同的“标准”调用约定。然而,这无疑会影响函数调用的执行性能,并且也并不实际。因此,希望针对调用约定提出更好的方案,来解决上述问题,从而避免因为调用约定不匹配而导致的错误。
发明内容
考虑到现有技术中存在的问题,提出本发明,旨在减少或者避免由调用约定不匹配引发的错误。
根据本发明的一个方面,提供了一种用于函数调用的方法,包括:响应于检测到程序中的函数调用,获取用于执行所述函数调用的多个备选代码模块,所述多个备选代码模块分别符合多个调用约定;获取被调用函数所采用的特定调用约定;依据所获取到的所述特定调用约定,从所述多个备选代码部分中选择符合所述特定调用约定的代码模块来执行所述函数调用。
根据本发明的另一个方面,提供了一种用于函数调用的装置,包括:代码模块获取单元,配置为,响应于检测到程序中的函数调用,获取用于执行所述函数调用的多个备选代码模块,所述多个备选代码模块分别符合多个调用约定;调用约定获取单元,配置为获取被调用函数所采用的特定调用约定;代码模块选择单元,配置为,依据所获取到的所述特定调用约定,从所述多个备选代码部分中选择符合所述特定调用约定的代码模块来执行所述函数调用。
利用本发明实施例的方法和装置,可以在相对于用户透明的情况下确保函数的调用方和被调用方之间调用约定上的匹配,避免由于调用约定不一致引起的问题。
附图说明
通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。
图1示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于国际商业机器公司,未经国际商业机器公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201210500365.1/2.html,转载请声明来源钻瓜专利网。