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

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

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

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

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

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

最新文章

  1. VIM配置
  2. T-SQL、JET SQL、PL-SQL
  3. http服务器返回状态代码含义
  4. DP~数塔(hrbustoj1004)
  5. 百度图片爬虫-python版-如何爬取百度图片?
  6. VC5509的通用GEL代码
  7. docNet基础学完感想
  8. 1.12 dict 字典表
  9. 安装vue-cli
  10. IDEA tomcat8 控制台日志乱码
  11. 在SpringBoot中添加Redis
  12. tomcat如何访问非webapp下的资源文件
  13. mongodb删除重复数据
  14. 开发板测试-Wi-Fi
  15. Python3基础 str while+iter+next 字符串的遍历
  16. 搭建 Docker-Registry 私有仓库
  17. Spring框架总结(十二)
  18. JBPM学习第1篇:入门与安装
  19. oracle 之分析函数 over (partition by ...order by ...)
  20. java的Spring学习2--构造函数注入

热门文章

  1. 2016多校联合训练1 D题GCD (ST表+二分)
  2. ContestHunter暑假欢乐赛 SRM 03
  3. 【简单算法】40.Fizz Buzz
  4. win10下ndk编译arm可执行体
  5. 【树状数组】【P2345】 奶牛集会
  6. middle中间件
  7. acm1878欧拉回路
  8. Leetcode 002. 两数相加
  9. Javascript利用递归实现数组的快速排序
  10. Item 11 谨慎地覆盖Clone