为什么 Windows API 使用 stdcall 调用约定?
2024-08-31 16:37:34
作者:知乎用户
链接:https://www.zhihu.com/question/31453641/answer/52001143
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
回答1:
你是想问为啥Windows C++中全是stdcall或WINAPI,而不是cdecl的calling convention吧?原因简单直接,生成执行码小。WINAPI就是stdcall的一个宏定义,其实是一回事。stdcall约定是被调用者清栈,返回时指令带一个退栈参数就可以了,被调用者自己一句ret n就完事了。cdecl约定是调用者清栈,就是每一个调用者在函数调用完成后,要每一个调用者自己去拉esp把栈状况改回来。stdcall的缺点就是无法支持可变数量的参数,因为被调用者必须确定参数数量才能自己清栈。我印象中老Win32 API只有一个API支持变长参数,所以只有她是cdel而不是stdcall,来自user32的wsprintf。
发布于 2015-06-204612
回答2:
省点内存呗,栈顶指针弹回这个指令,只需要函数实现一下,而不需要每一次调用结束都去实现一下。当年从dos640k时代走出来的那堆微软程序员,对于节省内存有各种变态手段。启动阶段想方设法不加载com组件,实在扛不住了就做一个超级精简版com。更不用说MFC里面的各种变态省内存方法了。
发布于 2015-06-29
综上所述:
__stdcall 被调用者清理堆栈,生成执行代码小,节省内存。 缺点: 不支持可变参数。 windows api使用__stdcall是历史问题。
最新文章
- js限制输入框只能输入数字
- git 较基础命令
- Cannot install NodeJs: /usr/bin/env: node: No such file or directory
- MySQL-->;基础-->;001-->;MySQL基本操作
- 按月将Windows日志导出至CSV文件
- linq to xml 基本操作
- HDOJ_1010 Tempter of the Bone
- 关于本人遇到的nodejs的一些错误信息
- Brackets - 又一款牛x的WEB开发编辑器
- 对WPF中MeasureOverride 和ArrangeOverride 浅理解
- JAVA抽象类与接口
- HttpServletRequest、request常用方法、request常见应用、请求转发、RequestDispatcher
- 封装兼容性添加、删除事件的函数 addEventListener与removeEventListener
- ExtJS4.2学习(11)——高级组件之Grid
- PHP 数组和对象的相互转化
- java jstack dump 线程 介绍 解释
- twemproxy代理主干流程——剖析twemproxy代码正编
- LAMP动静分离安装(源码安装)
- SignalR 2.x入门(二):SignalR在MVC5中的使用
- js原生事件