[toc]

概念

调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。介绍 C/C++ 中的三种函数调用约定。

调用规范

__cdecl 约定

__cdecl 函数调用约定是我们最长见的一种约定,我们平时在写程序的时候默认会使用该种约定,其特点如下:

  • 参数从右向左依次传递,存放在堆栈中。
  • 堆栈平衡由调用函数来维护。
  • C语言编译时的函数命名规则为 下划线+名称__functionName

堆栈平衡是为了维护函数调用前后堆栈的状态来进行的一系列操作,具体解释请自行了解。

__stdcall 约定

__stdcall 约定是我们在写 WinAPI 的时候经常用的约定,很多 windows下面的 API 都是该种调用约定,其特点如下:

  • 参数从右向左依次传递,存放在堆栈中。
  • 堆栈平衡由被调用函数来维护
  • C语言编译时的函数命名规则为 下划线+名称+@+参数字节大小__functionName@len

本约定在写 WinAPI 的时候经常用到,和 __cdecl 的却别在于堆栈平衡由函数自身进行维护。

__fastcall 约定

__fastcall 约定从名称上可以看出是速度快,因为其参数是可以放在寄存器中传递的,通常需要在要求高效率的函数中使用此约定,其特点如下:

  • 最右侧两个参数由 ecxedx 两个寄存器来传递,剩余参数从右往左依次存放在堆栈中。
  • 堆栈平衡由被调用函数来维护
  • C 语言编译时的函数命名规则为 @+函数名+@+参数大小@functionName@len

该约定是高效率的调用约定,和另外两种约定最大的区别就是参数的传递方式,利用了寄存器来快速的传递。

C++编译时的函数名规则

C++ 和 C 语言的命名规则是不同的,C++ 要比 C 语言复杂的多

最后修改日期: 27 2 月, 2025

作者

留言

撰写回覆或留言