以前看windows编程时一直有个 _stdcall 函数调用约定 一直不是很理解,只能硬记。 现在终于在《程序是怎样跑起来的》这本书书中找到了答案。

1. _stdcall 是standard call (标准调用) 的略称

Windows提供的DLL文件内的函数基本上都是_stdcall调用方式。但用C语言编写的程序内的函数,默认设置都不是 _stdcall. C语言特有的调用方式成为C调用,之所以默认不使用 _stdcall, 是因为C语言所对应的函数传入的参数是可变的,只有函数调用方才能知道到底有多少个参数,这种情况下,栈的清理作业便无法进行(关于这点会在下面详细说明)。不过,如果在C语言中函数的参数固定的话,指定 _stdcall 是没有问题的。

2. 通过 _stdcall 调用来减小程序文件的大小

   C语言中,在调用函数后,需要执行栈清理处理指令。指的是把不需要的数据从接收和传递函数的参数时使用的内存上的栈区域清理出去。该命令是在程序编译时由编译器自动附加到程序中的,编译器默认将该处理附在函数调用方。在同一个程序中,同样的函数可能会被反复调用多次,而如果是同样的函数,栈清理处理的内容也是一样。由于该处理是在调用函数一方,因此就会导致同一处理被反复进行,造成内存浪费。、

栈清理处理,比起在函数调用方进行,在反复被调用的函数一方进行时,程序整体要小一些。这时所使用的就是 _stdcall。在函数前加上 _stdcall 就可以把栈清理处理变为在被调用函数一方进行。下面是图示:

_stdcall调用相关推荐

  1. 【原创+整理】简述何为调用约定,函数导出名以及extern C

    何为调用约定 调用约定指的是函数在调用时会按照不同规则,翻译成不同的汇编代码.这和参数的压栈顺序和栈的清理方式相关,也就是说不同的调用约定,这些方式会做相应改变.一般编译器是以默认的调用约定编译一份代 ...

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

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

  3. _cdecl、_stdcall 、_fastcall、_thiscall 函数调用方式与区别

    几种函数调用方式 __cdecl 是C DECLaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈.被调用 ...

  4. (转)__declspec(dllimport)和__declspec(dllexport)的区别,以及有关c/c++调用约定

    DLL可以使用两种方法将公共符号导入到应用程序中或从 DLL 导出函数: 生成 DLL 时使用模块定义 (.DEF) 文件.  在主应用程序的函数定义中使用 __declspec(dllimport) ...

  5. 函数调用方式__stdecl _stdcall _fastcall __thiscall介绍

    __cdecl 是C DECLaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈.被调用函数不会要求调用者 ...

  6. dll动态库调用约定

    1.动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件.动态链接提供了一种方法,使进程可以调用不 ...

  7. 【转】调用约定__cdecl、__stdcall和__fastcall的区别

    什么是调用约定 函数的调用约定,顾名思义就是对函数调用的一个约束和规定(规范),描述了函数参数是怎么传递和由谁清除堆栈的.它决定以下内容:(1)函数参数的压栈顺序,(2)由调用者还是被调用者把参数弹出 ...

  8. 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)

    关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解. microsoft的vc默认的是__cdecl方式,而windo ...

  9. 动态链接库、名字修饰约定、调用约定

    调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议.这种协议规定了该语言的函数中的参数传送方式.参数是否可变和由谁来处理堆栈等问题.不同的语言定义了不 ...

最新文章

  1. 时间序列举例--------协方差+相关系数+随机游走+平稳性
  2. 操作系统原理第八章:内存管理
  3. Javaamp;amp;(面试题)初始化顺序总结
  4. Python之调用JS的方式
  5. [BUUCTF-pwn]——wdb_2018_2nd_easyfmt
  6. 重新理解“失败是成功他妈”
  7. GoldenGate实施参考
  8. 自己的界面添加ani动态炫酷光标
  9. 带你了解强大的Cadence家族,你可能只用到了它1/10的工具
  10. 019年中国航空三字代码对照表完全汇总
  11. 混合线性模型笔记1:模型假定
  12. bili弹幕姬_bilibili弹幕姬怎么用 - 卡饭网
  13. 繁体转简体 java_在java中,怎么把繁体字转化为简体字
  14. 【初/中级前端面经】中小型公司面试时都会问些什么?
  15. oracle中both,ORACLE:scope=both|memery|spfile
  16. 图片加载oom以及photoView缩放崩溃问题
  17. dx12 龙书第十六章学习笔记 -- 实例化与视锥体剔除
  18. Vim 为什么把 HJKL 当作光标键?
  19. [附源码]Python计算机毕业设计超市商品管理系统
  20. 提取DWG图纸中的图元信息

热门文章

  1. 一文读懂常用日志框架(Log4j、SLF4J、Logback)有啥区别
  2. 2019年,被高估的AI与数据科学该如何发展?
  3. linux小波识别算法,人脸识别相关技术之小波变换
  4. 单引号和冒号不能存入mysql么_mysql单引号和双引号的用法
  5. 触摸屏mtp文件转c语言,F28335与上位机(触摸屏)之间的通讯遵循modbus协议使用C语言编程...
  6. Python才是世界上最好的语言
  7. 数据中心IT机房末端气流组织管理
  8. 口令红包 java,[1.7.2]Gifts — 我的世界服务器在线礼物和登陆奖励插件
  9. Python编程语言学习:for循环实现对多个不同的DataFrame数据执行相同操作(可用于对分开的测试集、训练集实现执行相同逻辑任务)
  10. AI开发者大会:2020年7月3日09:30--09:50司罗《为商业搭建语言桥梁》