- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ctricks27i386平台的其它函数调模型
C++Tricks2.7I386
平台的其它函数调
⽤模型
从farseerfc. 导⼊
2.7I386平台的其它函数
调⽤模型
上⽂介绍的只是I386平台上C函数调⽤的标准模型,被称
作__cdecl。事实上,MicrosoftVisualC++编译器还⽀
持其它⼀些函数调⽤模型,所有调⽤模型名称皆以双下
划线开头,下⾯列出所有函数调⽤模型的异同 :
1__cdecl
参数压栈顺序 :逆序(从右⾄左)
参数堆栈恢复者 :主调函数(caller)
__cdecl明确地指出函数使⽤C函数调⽤模型,这是默认
的调⽤模型。
2__stdcall
参数压栈顺序 :逆序(从右⾄左)
参数堆栈恢复者 :被调函数(callee)
__stdcall是微软所谓的标准调⽤模型。可惜的是它与
__cdecl不兼容。⼏乎所有的Win32API函数使⽤这种函
数调⽤模型,希望在DLL之间,或者在程序和WinNT操
作系统之间传递函数指针的函数也应该使⽤这种模型。
与__cdecl模型的不同之处在于,__stdcall模型下由被
调函数恢复堆栈。主调函数在call语句之后,不需要再加
上add语句。⽽被调函数的ret语句则被添加⼀个参数,
代表函数参数堆栈的⻓度。因此,被调函数需要明确的
知晓函数参数的数量和类型,所以在__stdcall模型下不
⽀持可变参数表,所有参数必须写明。
3__thiscall
参数压栈顺序 :逆序(从右⾄左),this⽤ecx传递。
参数堆栈恢复者 :被调函数(callee)
__thiscall是VC编译器中类的⾮静态成员函数(non-
staticmemberfuncton)的默认调⽤模型。但是如果此
成员函数有可变参数表,VC编译器会使⽤__cdecl。和
__stdcall⼀样,__thiscall由被调函数恢复堆栈。⽐较独
特的是__thiscall会通过ecx寄存器传递成员函数的this
指针,⽽__cdecl下this指针是通过在参数表最前⾯增加
⼀个函数参数来传递的。__thiscall是VC编译器对this指
针的使⽤的⼀种优化,⼤⼤提⾼了⾯向对象程序的效
率。在VC2003及之前的编译器上__thiscall不是⼀个关
键字,不能被显式指定。但可以给成员函数显式指定
__cdecl来避免使⽤__thiscall。
4__fastcall
参数压栈顺序 :逆序(从右⾄左),前两个32位函数参
数放⼊ecx和edx中
参数堆栈恢复者 :被调函数(callee)
快速函数调⽤模型,将前两个32位函数参数放⼊ecx和
edx中,其余参数再逆序压栈。使⽤的是和__thiscall类
似的优化技术,加快函数调⽤,适合运⽤在⼩型inline函
数上。同样使⽤__stdcall形式的被调函数恢复堆栈,所
以不⽀持可变参数表。
5__pascal
参数压栈顺序 :正序(从左⾄右)
参数堆栈恢复者 :被调函数(callee)
过程式编程语⾔Pascal所使⽤的函数调⽤模型,由此得
名。也是16位版本的Windo s使⽤的API模型,过时的
模型,现在已经废弃且禁⽌使⽤。你会看到有些书本仍
会不时提到它,所以需要注意。__pascal是正序压栈,
这与⼤部分I386函数模型都不相同。与__stdcall⼀样,
由被调者恢复堆栈,不⽀持可变参数表。历史上曾有过
的别名PASCAL、pascal、_pascal(单下划线),现在都
改成了__stdcall的别名,与__pascal(双下划线)不同。
6其它函数调⽤模型,以及模型
别名。
__syscall :操作系统内部使⽤的函数调⽤模型,由
⽤户模式向核⼼模式跳转时使⽤的模型。由于⽤户模式
和核⼼模式使⽤不同的栈,所以没办法使⽤栈来传递参
数,所有参数通过寄存器传递,这限制了参数的数量。
⽤户模式编程中不允许使⽤。
__fortran :数学运算语⾔fortran使⽤的函数模型,
由此得名。在C中调⽤由fortran编译的函数时使⽤。
__clrcall :微软.Net框架使⽤的函数模型,托管
(Managed)C++默认使⽤,也可以从⾮托管代码调⽤托管
函数时使⽤。参数在托管栈上正序(从左⾄右)压栈,不使
⽤普通栈。
CALLBACK、PASCAL、WINAPI、APIENTRY、
AP
您可能关注的文档
- 育种对玉米产量增长的贡献节选donaldnduvickiowastate.doc
- 课题东南亚第1课时课型新授教学目标知识与技能1了解东南亚.doc
- 第七课辩证法之联系.doc
- 试验一认识试验.doc
- aaccounting会计accountingcost会计成本accountingprofit会计.doc
- 西南大学研究生国家奖学金评选指标评价表-西南大学资源环境学院.doc
- 试卷代号1118-宜昌广播电视大学.doc
- 高飞-浙江工业大学计算机学院.doc
- 日本平和学会秋季研究集会报告レジュメ原发とコミュニケーション.doc
- 枪ヶ岳黄金平.doc
- 福莱特玻璃集团股份有限公司海外监管公告 - 福莱特玻璃集团股份有限公司2024年度环境、社会及管治报告.pdf
- 广哈通信:2024年度环境、社会及治理(ESG)报告.pdf
- 招商证券股份有限公司招商证券2024年度环境、社会及管治报告.pdf
- 宏信建设发展有限公司2024 可持续发展暨环境、社会及管治(ESG)报告.pdf
- 品创控股有限公司环境、社会及管治报告 2024.pdf
- 中信建投证券股份有限公司2024可持续发展暨环境、社会及管治报告.pdf
- 洛阳栾川钼业集团股份有限公司环境、社会及管治报告.pdf
- 361度国际有限公司二零二四年环境、社会及管治报告.pdf
- 中国神华能源股份有限公司2024年度环境、社会及管治报告.pdf
- 广西能源:2024年环境、社会及治理(ESG)报告.pdf
文档评论(0)