梁老虎

人无远虑,必有近忧

导航

函数调用规范

[摘至高质量程序设计指南]
函数调用规范
与函数栈使用密切相关的就是函数调用规范,即调用约定(Calling Convertion)。函数调用规范决定了函数调用的实参压栈、退栈及栈释放的方式,以及函数名改编(Name_Mangling)的方案,也即命名的规范(Naming Convention)。
Windows环境下常用的调用规范有:
(1)_cdecl:这是C++/C函数的默认调用规范,参数从右向左依次传递并压入堆栈,由调用函数负责堆栈的清退,因此这种方式利于传递个数可变的参数给被调用函数。(一般像printf这类参数可变的函数,最左边的参数都是确定的,从右向左压栈的时候,判断到参数是类型是确定的同类型说明参数传递完毕
(2)_stdcall:这个是WinAPI函数使用的调用规范。参数从右向左依次传递并压入堆栈,由被调用函数负责堆栈的清退。该规范生成的函数代码比_cdecl更小,但当参数可变的时候,会转化为_cdecl规范。
(3)_thiscall:是C++非静态成员函数的默认调用规范,不能使用个数可变的参数。当调用非静态成员函数的时候,this指针直接保存在ECX寄存器中而非压入堆栈中。
(4)_fastcall:该规范所修饰的函数的实参将被直接传递到CPU寄存器中而不是内存堆栈中。该规范不能用于成员函数。

posted on 2009-09-29 22:41  梁老虎  阅读(372)  评论(0编辑  收藏  举报