函数调用的三种约定,你都清楚吗

本文介绍了C/C++中的三种函数调用约定:__cdecl、__stdcall和__fastcall。__cdecl是默认方式,参数从右向左入栈,主调函数清理栈;__stdcall参数同样从右向左入栈,但被调函数清理栈;__fastcall则优先使用寄存器传参,提高效率。通过实例和汇编代码,分析了三种约定在栈平衡和性能上的差异。
摘要由CSDN通过智能技术生成

__cdecl、__stdcall、__fastcall是C/C++里中经常见到的三种函数调用方式。其中__cdecl是C/C++默认的调用方式,__stdcall是windows API函数的调用方式,只不过我们在头文件里查看这些API的声明的时候是用了WINAPI的宏进行代替了,而这个宏其实就是__stdcall了。

三种调用方式的区别相信大家应该有些了解,这篇文章主要从实例和汇编的角度阐述这些区别的表现形态,使其对它们的区别认识从理论向实际过渡。

我们知道,函数的调用过程是通过函数栈帧的不断变化实现的:

image

函数的调用,涉及参数传递,返回值传递,调用后返回,这都是通过栈的变化来实现的,对于三种调用约定而言:

__cdecl:

C/C++默认方式,参数从右向左入栈,主调函数负责栈平衡。

__stdcall:

windows API默认方式,参数从右向左入栈,被调函数负责栈平衡。

__fastcall:

快速调用方式。所谓快速,这种方式选择将参数优先从寄存器传入(ECX和EDX),剩下的参数再从右向左从栈传入。因为栈是位于内存的区域,而寄存器位于CPU内,故存取方式快于内存,故其名曰“__fastcall”。

下面从实例来认识一下这三种调用约定。先来看一个简单的不能再简单的程序了&#x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值