关于_stdcall和_cdecl
参考网址:
https://blog.csdn.net/myjisgreat/article/details/46477769
https://bbs.csdn.net/topics/390435293?page=1#post-394308806
https://docs.microsoft.com/en-us/cpp/cpp/argument-passing-and-naming-conventions?view=vs-2019

  • _stdcall和_cdecl,这两种方式的区别为调用后谁来恢复栈数据。

即:
_stdcall为被调用者恢复栈上数据
_cdecl为调用者恢复栈上数据

  • 空间方面

_cdecl为调用者恢复栈上数据,假设有一百个不同的函数调用函数a,那么内存中就有一个段恢复堆栈的代码。
_stdcall为被调用者恢复栈,只有在函数代码的结尾出现一次恢复堆栈代码,所以节约空间。
注意,这些恢复堆栈的代码是编译器根据你给他的call方式自动生成的,所以你无需考虑…而告诉编译器call方式的意义就在这里,如果一方用cdecl一方用stdcall可能出现没有人释放堆栈的情况,这明显是不允许的

_cdecl为被调用函数返回后,由调用者恢复堆栈
_stdcall为被调用函数返回前由被调用函数自己恢复堆栈

  • 函数变参方面

_cdecl的优势在于他可以不定参数个数,参考printf函数。原因在于是调用者存入参数,调用者释放参数占有的空间,都是调用者完成的,所以有参数个数的自由性
_stdcall在结束函数时,恢复的空间是编译时决定的,函数负责释放,但他无法知道你实际压入几个参数,于是stdcall在编译时就规定了参数个数,无法实现不定个数的参数调用

_stdcall和_cdecl相关推荐

  1. C++函数调用方式(_stdcall, _pascal, _cdecl...)总结 收藏

    C++函数调用方式(_stdcall, _pascal, _cdecl...)总结 收藏 __stdcall: _stdcall 调用约定相当于16位动态库中经常使用的PASCAL调用约定.在32位的 ...

  2. _stdcall与_cdecl的区别

    _stdcall与_cdecl的区别 最大的区别就是__cdecl是由调用函数者释放堆栈,而__stdcall由被调用者释放.但是在调用任一种函数时,都没有进行显示的释放堆栈工作.这个工作由编译器完成 ...

  3. C++函数调用方式(_stdcall, _pascal, _cdecl...)总结

    __stdcall:       _stdcall 调用约定相当于16位动态库中经常使用的PASCAL调用约定.在32位的VC++5.0中PASCAL调用约定不再被支持(实际上它已被定义为__stdc ...

  4. 各种函数调用约定及浮点数传参

    32位下_stdcall, _fastcall, _cdecl #include <windows.h>int _stdcall Func1(int a, int b, int c, in ...

  5. Linux函数名加数字,C++ 编译器的函数名修饰规则

    函数名字修饰(Decorated Name)方式 函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型.LINK程序或其他工具有时需要指定函数的 ...

  6. 如何让API回调你的VC类成员函数而不是静态函数

    首先需要包含一个由yzwykkldczsh同志编写的模板类-----万能多用自适应无限制回调模板(为纪念友人fishskin,此模板又称为H>W模板) /******************** ...

  7. __cdecl、__stdcall、__fastcall 与 __pascal 浅析

    X86调用约定 calling convention:https://www.cnblogs.com/shangdawei/p/3323252.html __cdecl.__stdcall.__fas ...

  8. MFC 教程【7_MFC的DLL 】

    MFC的DLL 一般的,在介绍Windows编程的书中讲述DLL的有关知识较多,而介绍MFC的书则比较少地提到.即使使用MFC来编写动态链接库,对于初步接触DLL的程序员来说,了解DLL的背景知识是必 ...

  9. C语言学习笔记--函数

    1. C 语言中的函数 (1)函数的由来: 程序 = 数据 + 算法→C 程序 = 数据 + 函数 (2)模块化程序设计 (3)C 语言中的模块 2. 面向过程的程序设计 (1)面向过程是一种以过程为 ...

  10. 2022按键精灵内存逆向新教程:乐玩篇:1-10课更新试看

    大家好,我是类人猿!之前帖子是关于图文,可能很多同学看起来费劲.下面我用乐玩插件内存汇编命令给大家做一期视频关于内存逆向讲解教学.主要是针对我们主流游戏的内存读写和汇编call.hook等演示试看.内 ...

最新文章

  1. java调用PageOffice生成word
  2. Python垂直翻转图像(Vertically Flip Image)
  3. Apache Rewrite url重定向功能的简单配置
  4. 冰球项目开发日志(一)
  5. 成功解决TypeError int object is not iterable
  6. mvc:interceptor 不起作用的一个解决方法
  7. Reflector 插件-Reflexil
  8. LINUX的文件链接,管道和用户组
  9. Python补充之函数
  10. 引用java8里的方法_Java8中方法引用的使用详解
  11. asp.net Json序列化
  12. 中兴威武3android驱动,中兴威武3
  13. 一文详解bundle adjustment
  14. html5 制作书架展示 PHP,基于HTML5 Canvas的CSG构造实体几何书架
  15. requests爬虫实践之虎扑步行街主干道帖子数据并保存为txt文件(python实现)
  16. 高通骁龙芯片的随身wifi入门刷机教程
  17. 从Workflowy到印象笔记
  18. Ubuntu 搜狗输入法 中文 无法切换 英文
  19. win10taskkill强行结束进程_Win10程序卡死怎么办? Win10强制结束进程的两种方法
  20. 华为离职副总裁徐家骏给任正非的辞职信,太震撼了!

热门文章

  1. python微博爬虫实战_爬虫实战——四大指数之微博指数(一)
  2. java毕业设计校园实习管理系统mybatis+源码+调试部署+系统+数据库+lw
  3. 学习笔记:EPS高级功能1-车道保持辅助LKA(Lane Keeping Assist)
  4. 企业微信怎么批量加人?怎么管理员工?看看这套系统
  5. TF-IDF算法介绍及实现
  6. 桌面计算机名水印,去掉电脑桌面的Windows10教育版水印的方法
  7. Unity项目的框架设计
  8. iredmail邮件服务器安装流程
  9. matlab读取图片亮度,Matlab读取BMP位图并显示亮度值三维图
  10. python抽奖小程序_python实现简单的抽奖小程序,抽奖的内容从文件里面读取