为什么 Windows API 使用 stdcall 调用约定?

Posted 快乐的GTD吧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么 Windows API 使用 stdcall 调用约定?相关的知识,希望对你有一定的参考价值。

作者:知乎用户
链接: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-2046?12

回答2:
省点内存呗,栈顶指针弹回这个指令,只需要函数实现一下,而不需要每一次调用结束都去实现一下。当年从dos640k时代走出来的那堆微软程序员,对于节省内存有各种变态手段。启动阶段想方设法不加载com组件,实在扛不住了就做一个超级精简版com。更不用说MFC里面的各种变态省内存方法了。
发布于 2015-06-29

综上所述:
__stdcall 被调用者清理堆栈,生成执行代码小,节省内存。 缺点: 不支持可变参数。 windows api使用__stdcall是历史问题。

以上是关于为什么 Windows API 使用 stdcall 调用约定?的主要内容,如果未能解决你的问题,请参考以下文章

用于在 Windows 上捕获声音的 API

为什么 Windows API 使用 stdcall 调用约定?

什么 API 可用于在 Windows 文件系统上创建驱动器?

Windows API一日一练 2 使用应用程序句柄

什么叫WINDOWS API ?

如何在 Windows Form C# 中使用 Binance API [关闭]