首页 > 代码库 > C++技术问题总结-第13篇 调用约定有哪些,有什么不同
C++技术问题总结-第13篇 调用约定有哪些,有什么不同
调用约定(Calling convention),决定以下内容:
a. 函数参数的压栈顺序。
b. 由调用者还是被调用者把参数弹出栈。
c. 以及产生函数修饰名的方法。
常用的调用约定为__stdcall、__cdecl、__fastcall。
1) __stdcall。
StandardCall的缩写,约定内容:
a. 参数从右向左压入堆栈。
b. 函数被调用者修改堆栈。
c. 输出函数名前加上一个下划线前缀,后面加上一个"@"符号和其参数的字节数,格式为_functionname@number,例如 :function(int a, int b),其修饰名为:_function@8
通常用于Win32 Api中,主要见于Microsoft Visual C、C++。
对应宏定义:#define WINAPI __stdcall
2) __cdecl。
C Declaration的缩写,约定内容:
a. 参数从右到左入栈。
b. 调用者清除栈,俗称手动清栈。
c. 输出函数名前加上一个下划线前缀,格式为_functionname。
__cdecl为C/C++语言默认的函数调用方法。
3) __fastcall。
为了提高调用速度,将前两个(或若干个)参数由寄存器传递,其余参数还是通过堆栈传递。
快速调用,约定内容:
a. 参数从右向左压入堆栈。
b. 函数被调用者修改堆栈。
c. 输出函数名前加上一个"@"符号,后面也是一个"@"符号和其参数的字节数,格式为@functionname@number。
不同编译器编译的程序规定的寄存器不同。在Intel x86平台上,使用ECX和EDX寄存器。使用__fastcall方式无法用作跨编译器的接口。
C++技术问题总结-第13篇 调用约定有哪些,有什么不同