首页 > 其他分享 >函数调用约定——__cdecl与__stdcall

函数调用约定——__cdecl与__stdcall

时间:2024-03-30 11:14:11浏览次数:29  
标签:__ 调用者 cdecl 函数调用 参数 栈中 stdcall

1.定义

函数调用约定,也称函数调用协议,是指在函数调用时,确定函数参数如何传递给被调用的函数,以及如何返回结果值给调用者的一系列规则。也就是函数的调用者与被调用者之间如何传参以及如何恢复栈平衡

2.职责

  1. 规定了函数参数的压栈顺序,即有多个参数时,按照什么顺序进行压栈;
  2. 规定了由谁负责清理栈,即函数调用后,是调用函数还是被调用函数来把栈恢复成调用前的样子。

3.种类

函数调用约定有很多,本文简要讨论以下两种:
(说明:调用者caller,即调用函数;被调用者callee,即被调用函数)

  1. __cdecl
  • 调用者:
    • 将函数参数从右向左压栈;
    • 调用结束后,负责调整栈指针以清除栈中的参数。这意味着调用者需要手动管理栈中的内容,确保栈的前后状态是正确的。
  • 被调用者:
    • 读取栈中参数以执行函数功能;
    • 功能执行完毕后将结果返回给调用者,不负责清理栈。
  1. __stdcall
  • 调用者:
    • 同样将函数参数从右向左压栈;
    • __cdecl不同,调用者不负责在调用结束后清理栈中的参数。
  • 被调用者:
    • 同样读取栈中参数以执行函数功能;
    • 调用结束后,除了负责调整栈指针以清除栈中的参数外,还要清理栈中的参数,这意味着由被调用者来管理函数执行期间所使用的栈空间。

4.使用场景

__cdecl由于其灵活性(调用者可以传递任意数量的参数,即使与函数声明不符也不会在编译时产生错误)而被C和C++编译器用作默认的函数调用约定。而__stdcall则常用于Windows API等需要严格参数匹配和自动栈管理的场合,特别是在Windows API和需要跨编译器、跨平台兼容性的场合中。


参考资料:

chatgpt

标签:__,调用者,cdecl,函数调用,参数,栈中,stdcall
From: https://www.cnblogs.com/hell0er/p/18105211

相关文章

  • 探索 Go 的 Fan-Out/Fan-In 模式:让并发更 easy
    探索Go的Fan-Out/Fan-In模式:让并发更easy原创 GoOfficialBlog GoOfficialBlog 2024-03-2921:03 中国香港 听全文学习如何利用Go语言的并发性能,使用扇出/扇入模式。探索这种模式如何在Go应用程序中简化复杂的并发任务。Introduction并发在Go中可以......
  • Git学习记录(一):安装与配置
    Git安装:Linux系统自带:终端中输入git即可Windows系统安装:git下载:https://git-scm.com/download/win将git添加至环境变量git--version查看git版本Git配置:gitconfig--global--list 用于查看git配置信息,主要包括邮箱email和姓名namePSC:\Users\qiyh>gitconfi......
  • 权限、路径全部都正确,thinkphp验证码还是显示不出来解决
    尝试了各种方法,thinkphp验证码还是显示不出来解决方法:检查application/config.php和application/database.php等配置文件是否正确设置我遇到的是编码问题问题是怎么出现的呢?我从其他电脑移植到另外一台电脑,原电脑可以显示在另外一台电脑不能显示,我用文本文件修改......
  • yii2 Gii使用和自定义模板
    yii2Gii使用和自定义模板配置开启giiconfig/web.php添加代码if(YII_ENV_DEV){$config['bootstrap'][]='gii';$config['modules']['gii']=['class'=>'yii\gii\Module',];}入口脚本web......
  • gRPC框架
    读了songguojun大佬的一篇文章gRPC框架详解,总结一下关于gRPC的知识点RPC是什么RPC是远程调用,是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议,简单的理解就是一个节点请求另一个节点提供的服务。RPC只是一套协议,基于这套协议规范来实现的框架称为RPC框架......
  • 搜索树
    1.二叉搜索树1.1二叉搜索树概念若左子树不为空,则左子树上所有节点的值都小于根节点的值若右子树不为空,则右子树上所有节点的值都大于根节点的值如果中序遍历(左根右),结果从小到大有序。所以,二叉搜索树也叫二叉排序树 1.2二叉搜索树的实现classBinarySearchTree{......
  • gPTP介绍
    802.1AS通用精确时间协议gPTP(GeneralizedPrecisionTimeProtocol),将为汽车、工业自动化控制等领域实现精确时间的测量。1.基本构成在802.1AS中,时间同步是按照“域”(domain)划分的,包含多个PTP节点。在这些PTP节点中,有且仅有一个全局主节点(GrandMasterPTPInstance),......
  • 6.android 中使用lombok
    没啥好说的上图!!!三个更改的地方lombok简化代码参考https://www.cnblogs.com/c2g5201314/p/14646120.html......
  • 解决在 VS Code 中无法自动导入 QApplication 类的问题
    起因在尝试使用VSCode来开发PySide6应用时,发现输入下面的代码时,没有触发Pylance的自动导入功能。app=QApplication()我期望的:#自动导入fromPySide6.QtWidgetsimportQApplication结果:什么都没有发生解决方法这个问题其实已经有人向Pylance扩展的开发者反......
  • 深度学习-卷积神经网络--Unet训练推理-60
    目录网络结构importtensorflowastfimportosimportsysimportnumpyasnpfromtqdmimporttqdmfromitertoolsimportchainfromskimage.ioimportimread,imshowfromskimage.transformimportresizeimportrandomimportmatplotlib.pyplotaspltpri......