作者:知乎用户
链接: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是历史问题。