[toc]
概念
调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。介绍 C/C++ 中的三种函数调用约定。
调用规范
__cdecl
约定
__cdecl
函数调用约定是我们最长见的一种约定,我们平时在写程序的时候默认会使用该种约定,其特点如下:
- 参数从右向左依次传递,存放在堆栈中。
- 堆栈平衡由调用函数来维护。
- C语言编译时的函数命名规则为
下划线+名称
:__functionName
堆栈平衡是为了维护函数调用前后堆栈的状态来进行的一系列操作,具体解释请自行了解。
__stdcall
约定
__stdcall
约定是我们在写 WinAPI
的时候经常用的约定,很多 windows下面的 API 都是该种调用约定,其特点如下:
- 参数从右向左依次传递,存放在堆栈中。
- 堆栈平衡由被调用函数来维护
- C语言编译时的函数命名规则为
下划线+名称+@+参数字节大小
:__functionName@len
本约定在写 WinAPI
的时候经常用到,和 __cdecl
的却别在于堆栈平衡由函数自身进行维护。
__fastcall
约定
__fastcall
约定从名称上可以看出是速度快,因为其参数是可以放在寄存器中传递的,通常需要在要求高效率的函数中使用此约定,其特点如下:
- 最右侧两个参数由
ecx
和edx
两个寄存器来传递,剩余参数从右往左依次存放在堆栈中。 - 堆栈平衡由被调用函数来维护
- C 语言编译时的函数命名规则为
@+函数名+@+参数大小
:@functionName@len
该约定是高效率的调用约定,和另外两种约定最大的区别就是参数的传递方式,利用了寄存器来快速的传递。
C++编译时的函数名规则
C++ 和 C 语言的命名规则是不同的,C++ 要比 C 语言复杂的多
留言