首页 » 信息技术 »

函数调用方式cdecl和stdcall的区别

2020年5月25日 / 1次阅读
CC++

cdecl是标准的C/C++编译器函数调动方式,stdcall是WinAPI的函数调用方式。这部分的知识,都是编译器需要用到的,普通开发人员一般了解一下即可。

在70年代,美国人丹尼斯·里奇发明了C语言,并且使用C语言编写UNIX,由此他就成为了C语言之父和UNIX操作系统之父。由于UNIX操作系统非常高效,修改起来也很方便,是得益于使用了C语言来编写。随着UNIX操作系统的推广,C语言也变成了一个流行的语言。要让UNIX变得高效率,那么C语言的设计上,就要着眼于高效的设计。

在函数调用这方面的设计,就体现了这一点。在C语言的函数调用时,需要传送多个参数。这些参数的传送是可以通过寄存器或者栈来传送。那你也许问为什么不只使用寄存器这一种方式呢?由于函数调用的参数比较多,比如达到5个。并且在那时候的CPU的寄存器非常少,也满足不了这个要求。不像目前ARM或MIPS的CPU,寄存器比较多,多达13个之多。这时全部使用寄存器来传送参数是基本可以解决问题了。(使用寄存器传递参数快,是因为访问寄存器的速度比访问内存要快许多

在当时的环境之下,设计的C语言的编译器都是按栈的方式来传递函数调用的参数,这样不但可以解决寄存器少的问题,也可以解决另外一个问题,就是可以动态地传递参数的个数。

上面只是解决了个数的问题,那又出现了另外一个问题,就是参数的入栈的顺序问题。这个好比像学校里体育老师叫一班学生来排队,排头是从高到矮,还是从矮到高的选择。在入栈这个问题上,C语言也面临两个选择,一个跟代码的书写的顺序一样从左到右,另一个是从右到左。在考虑到动态参数的问题之后,C语言的设计者采用了从右到左的入栈方式,这种方式有两个优点:一是函数运行时,默认方式是从左到右,意味着出栈的方向应优先为栈顶的元素,这样可以提高运行效率;二是函数参数不定时,运行时分析字符串里出现需要的参数,每出现一个参数就弹出栈一次,跟运行分析的顺序一致。

cdecl,从右到左压栈,调用者清栈;

stdcall,从右到左压栈,被调用者清栈。

本文链接:https://www.maixj.net/ict/cdecl-stdcall-23670

相关文章

留言区


前一篇:

-->只要几分钟回答问卷,就能轻松赚现金!

栏目精选

云上小悟,麦新杰的独立博客

Ctrl+D 收藏本页

栏目


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。

网站二维码
go to top