C语言三种函数调用约定_第1页
C语言三种函数调用约定_第2页
C语言三种函数调用约定_第3页
C语言三种函数调用约定_第4页
C语言三种函数调用约定_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C语言三种函数调用约定目录C语言常用的调用约定一、_cdecl调用约定二、_stdcall调用约定三、_fastcall调用约定总结

C语言常用的调用约定

以下就是C语言常用的三种调用约定:

调用约定参数压栈顺序平衡堆栈__cdecl从右往左依次入栈调用者清理堆栈__stdcall从右往左依次入栈自身清理堆栈__fastcallECX/EDX传递前两个参数剩下的从右往左依次入栈自身清理堆栈

下面会举例为大家讲解三种调用约定的区别。

一、_cdecl调用约定

这是C语言默认的调用约定,使用的平栈方式为外平栈

示例代码:

以下代码不使用任何调用约定,让我们来看看函数默认的调用约定是什么。

#includestdio.h

intmethod(intx,inty)

returnx+y;

intmain()

__asmmoveax,eax;//此处设置断点

method(1,2);

return0;

}

编译、调试、ALT+8调出反汇编如下:

根据上面这张图的描述,默认的约定很符合__cdecl约定。

使用cdecl约定,如下:

vs2010:Ctrl+Alt+F7重新生成、F5调试、ALT+8查看反汇编:

一模一样,可以看出__cdecl就是C语言默认的调用约定。

二、_stdcall调用约定

和__cdecl一样都是从右往左入栈参数,不过该调用约定使用的平栈方式是内平栈

示例代码:

Ctrl+Alt+F7重新生成、F5调试、ALT+8查看反汇编:

可以看到,这里已经看不到堆栈的处理了。

F11不断执行,直到进入call指令调用的method函数中:

平栈操作跑到函数内部了,__cdecl约定是调用者(main)函数进行平栈,而__stdcall约定是函数内部自身进行平栈。

三、_fastcall调用约定

这是一个比较特殊的调用约定,当函数参数为两个或者以下时,该约定的效率远远大于上面两种,当然随着参数越来越多,该约定与上面两种约定的差距逐渐缩小。

证明如下:

首先,我们使用__fastcall调用约定并传入两个参数。

重新生成、调试、汇编:

F11进入函数内部查看:

可以看出函数内部和外部都没有清理堆栈的操作。

这也就是__fastcall效率高的原因。

因为寄存器就是属于cpu的,然后堆栈是内存,使用cpu进行操作的效率肯定会大于使用内存,所以我们使用寄存器的效率肯定比push传参效率高很多啊。

那么为什么没有平栈操作呢?

因为我们没有使用堆栈啊,我们只是用了寄存器,并没有使用堆栈操作。

但是当我们传入更多的参数的时候就需要用到堆栈了,因为__fastcall他只给我们提供了两个寄存器ECX/EDX可以用来传参。

四个参数试试:

重新生成、调试、汇编:

F11进入函数内部查看:

通过四个参数的传递,证明了:

函数参数除了前两个参数使用寄存器、其他的依旧使用堆栈从右往左传参,并且是自身清理堆栈,不是调用者清理。

思考为什么参数越来越多的时候,__fastcall与其他调用约定的差距越来越小呢?

答:首先我们知道了使用寄存器(cpu)的效率远远大于使用堆栈(内存),然而__fastcall约定也只能使用两个寄存器,当函数参数只有两个时,__fastcall可以完全使用寄存器进行函数传参,所以这个时候他和__cdecl和__stdcall的差距最大。随着参数越来越多,__fastcall依旧只能使用两个寄存器,这样一来参数越多,__fastcall使用内存的占比就越大,所以性能差距也就越来越小。

总结

以上的内容汇总如下:

调用约定参数压栈顺序平衡堆栈调用约定特点__cdecl从右往左依次入栈调用者清理堆栈这是C语言默认的调用约定,使用的平栈方式为外平栈__stdcall从右往左依次入栈自身清理堆栈和__cdecl一样都是从右往左入栈参数,不过该调用约定使用的平栈方式是内平栈__fastcallECX/ED

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论