闲话__stdcall, __cdecl, __fastcall出现的历史背景以及各自解决的问题
可以认为最先由微软搞出来了__stdcall, 其实就是和WINAPI的声明是一样的,入栈顺序是从右到左,函数返回时,会进行出栈操作。
PASCAL语言是非常古老的编程语言,在C语言之前,因此在当时的时代中,PASCAL的调用约定也是__stdcall
后来在C语言中发现__stdcall不支持变长参数的函数调用,比如printf,可以携带任意N个参数。我们查看WINDOWS的API,是找不到类似这样的函数声明的。 因此在C语言中,就使用了另外一种调用约定:__cdecl ,为了解决任意参数的问题,它把出栈的工作交给了调用者,而不是在函数内部进行出栈,因为调用者是知道传递了多少个参数的。比如printf,调用printf的代码知道究竟传递了多少个参数进去,那么在函数返回后,它自然就知道要出栈多少个参数了。
__cdecl因为由调用者清理栈,在函数被频繁调用时,整个程序中会生成大量的出栈代码,因此最终程序体积会稍大。
在说__fastcall之前,我们先聊聊目前移动设备中的处理器:ARM芯片,ARM中的函数调用都是通过寄存器传递的,并没有通过入栈和出栈来传递参数。 WHY?答案就是性能。因此历史上的BORLAND公司的C++BUILDER提供了__fastcall的调用约定,参数都是通过寄存器来进行传递,只有寄存器不够时,才使用栈来操作。而微软对于__fastcall的支持并不是很广泛。可见当时C++BUILDER及VCL组件技术上确实非常牛逼,秒杀微软VC中的MFC。
__fastcall的返回方式类似于__stdcall,函数返回时进行出栈操作(如果有用到栈的话),因此它也不支持可变参数。
参考:http://blog.csdn.net/zjwoody/article/details/7887988
闲话__stdcall, __cdecl, __fastcall出现的历史背景以及各自解决的问题的更多相关文章
- __stdcall,__cdecl,__fastcall的区别
__stdcall,__cdecl,__fastcall的区别 标签: dll编译器pascalclassimportinitialization 2009-12-09 15:07 10472人阅读 ...
- 【C/C++开发】__stdcall,__cdecl,__fastcall的区别
__stdcall和__cdecl的区别 __stdcall和__cdecl是两种函数名字修饰.(注意是连续的两个下划线) Windows上 windows上不管是C还是C++,默认使用的都是__st ...
- __stdcall,__cdecl,__fastcall,_stdcall,_cdecl,_fastcall 区别简介[转]
今天写线程函数时,发现msdn中对ThreadProc的定义有要求: DWORD WINAPI ThreadProc(LPVOID lpParameter); 不解为什么要用WINAPI宏定义,查 ...
- (转)__cdecl __fastcall与 __stdcall
原帖 http://blog.sina.com.cn/s/blog_6b7c56870100l8rf.html __cdecl __fastcall与 __stdcall 调用约定: __c ...
- 调用约定__cdecl __fastcall与__stdcall
__cdecl __fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以 ...
- C调用约定__cdecl、__stdcall、__fastcall、__pascal分析
参考原文地址:https://www.cnblogs.com/yenyuloong/p/9626658.html C/C++ 中不同的函数调用规则会生成不同的机器代码,产生不同的微观效果,接下来让我们 ...
- __cdecl、__stdcall、__fastcall 与 __pascal 浅析
call 指令与 retn 指令 首先我们得了解 CALL 和 RETN 指令的作用,才能更好地理解调用规则,这也是先决条件. 实际上,CALL 指令就是先将下一条指令的 EIP 压栈,然后 JMP ...
- 论山寨手机与Android联姻 【1】MTK亮相的历史背景
[1]MTK亮相的历史背景如果说1960年代是大型机(Mainframe)的时代,1970年代是小型机(Microcomputer)的时代,那么1980年代无疑是个人电脑(PC)的时代,而1990年代 ...
- __stdcall __cdecl 引起的程序崩溃
崩溃弹出的截图如下 看到0xC0000005, 访问冲突的问题, 九成九是内存访问违规, 比如访问了已经释放的指针, 又或者是离开函数时栈被破坏之类. 找了一下午一直没有头绪, 好在有一份可以执行的源 ...
随机推荐
- Cookie , Session ,Session 劫持简单总结
cookie 机制: Cookies 是 服务器 在 本地机器 上存储的 小段文本,并伴随着 每一个请求,发送到 同一台 服务器. 网络服务器 用 HTTP头 向客户端发送 Cookies.在客户端, ...
- 以二进制方式读取图片保存到string
procedure TForm1.BitBtn1Click(Sender: TObject);var StringStream : TStringStream; FSize : integer; ...
- Zen-cart产品页面随机调用Wordpress文章
<?php require('./wordpress所在目录/wp-blog-header.php'); ?><?php$rand_posts = get_posts('number ...
- yield的表达式形式的应用(待补充)
1.yield的表达式形式应用的定义: 在一个生成器函数内,将yield赋值给一个变量,这就是yield的表达式形式.也叫生成器的表达式形式 2.send方法的定义: (1)定义: yield的表达式 ...
- 斐讯面试记录—三线程交替打印ABC
package cn.shenzhen.feixun; public class PrintABC extends Thread{ private String name; private Objec ...
- 63. Unique Paths II(有障碍的路径 动态规划)
Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...
- 安卓 Activity 生命周期
创建到销毁的生命周期: onCreate()->onStart()->onResume()->onPause->onStop->onDestroy 启动到前台在到后台的生 ...
- 51nod 1391 01串(hash+DP)
题目链接题意:给定一个01串S,求出它的一个尽可能长的子串S[i..j],满足存在一个位置i<=x <=j, S[i..x]中0比1多,而S[x + 1..j]中1比0多.求满足条件的最长 ...
- jstl c:choose>、<c:when>和<c:otherwise>标签的简单使用介绍
<c:choose>.<c:when>和<c:otherwise>在一起连用,可以实现Java语言中的if-else语句的功能.例如以下代码根据username请求 ...
- 前端使用html2canvas截图,在canvas上绘制图片及保存图片
1.使用html2canvas 存在的问题: 不同的机型绘制位置不同的问题. 这个主要因为Html动态设置了html的dpr.(dpr可以解决屏幕显示不了1pxborder和无法显示小于12px的文字 ...