函数调用的三种约定,你都清楚吗
__cdecl、函数__stdcall、调用的种都清__fastcall是约定C/C++里中经常见到的三种函数调用方式。其中__cdecl是函数C/C++默认的调用方式,__stdcall是调用的种都清windows API函数的调用方式,只不过我们在头文件里查看这些API的约定声明的时候是用了WINAPI的宏进行代替了,而这个宏其实就是函数__stdcall了。
三种调用方式的调用的种都清区别相信大家应该有些了解,这篇文章主要从实例和汇编的约定角度阐述这些区别的表现形态,使其对它们的函数区别认识从理论向实际过渡。
我们知道,调用的种都清函数的约定调用过程是通过函数栈帧的不断变化实现的云服务器提供商:

函数的调用,涉及参数传递,函数返回值传递,调用的种都清调用后返回,约定这都是通过栈的变化来实现的,对于三种调用约定而言:
__cdecl:
C/C++默认方式,参数从右向左入栈,主调函数负责栈平衡。
__stdcall:
windows API默认方式,参数从右向左入栈,被调函数负责栈平衡。
__fastcall:
快速调用方式。所谓快速,这种方式选择将参数优先从寄存器传入(ECX和EDX),剩下的参数再从右向左从栈传入。因为栈是位于内存的区域,而寄存器位于CPU内,故存取方式快于内存,故其名曰“__fastcall”。
下面从实例来认识一下这三种调用约定。先来看一个简单的不能再简单的程序了:
三个函数的内容都是一样的服务器托管,不同的是使用了三种调用的方式。我们先来看看在main函数调用三个函数的时候的汇编代码:

按照上面说的那样,__cdecl按照参数从右向左的方式进入栈区,注意Fun1()和Fun3()的区别,Fun1()在call Fun1()之后执行了add esp,8。这一操作正是我们前面所说的进行栈的平衡。调用函数之前连续进行了两次push操作将函数所需的实参5和2先后压入了栈区,调用完成后,我们需要恢复调用前的状态,则需调整栈顶指针esp的位置,这一工作由谁来完成就决定了两种函数调用方式__cdecl(主调函数完成)和__stdcall(被调函数完成)的区别。上图我们看到了__cdecl中由主调函数完成了,那么__stdcall呢,在被调函数Fun3()中,转向被调函数结尾处的代码,我们看到了这一句:

那么Fun1()结尾处又是香港云服务器如何呢?

看到了吧,这个ret指令后面跟没跟值就决定了函数返回是栈指针ESP需要增加的量。这样,不需要主调函数再调用add指令为ESP操作平衡栈区,节约了程序的开销,一条指令开销小,如果十万百万个这样的调用,这个开销就明显了。
说完了__cdecl和__stdcall,再来看看__fastcall,如前面图看到的调用时并未使用push指令向栈里传参数,而是使用了
mov edx, 5
mov ecx, 2
两条指令。这样直接将参数传入寄存器,被调函数在执行的时候直接从寄存器取值即可,省去了从栈里取出来给寄存器,再从寄存器取出来放入内存。
不过,说个题外话,ecx寄存器经常作为计数和C++里this指针的传递媒介。在这种情况下,情况又是怎样的呢,下次分析C++操作符 new 的时候再予以讨论。ecx做计数器时,需要将ecx中存储的实参先压入栈区,计数操作完成后再pop出来。如此一来,这个fastcall倒显得不那么fast了。
当然,上面所说的这些操作都是由编译器在背后为我们完成的,开发人员无需关心这些操作,对我们是透明的。不过,知其然更知其所以然方能立于不败之地!
相关文章
电脑星际战甲注册教程(让你在星际战甲中畅快享受战斗乐趣的详细指南)
摘要:作为一款备受瞩目的电脑游戏,电脑星际战甲一直以其精美的画面和刺激的玩法吸引着众多玩家。而要开始在这个世界中展开你的冒险之旅,首先你需要进行游戏的注册。本文将为大家详细介绍电脑星际战...2025-11-05探索OPPOR7007手机的性能与功能(一款高性能智能手机,满足你的多样需求)
摘要:在智能手机市场中,OPPOR7007手机以其卓越的性能和丰富的功能备受瞩目。本文将深入探讨该款手机的性能表现、功能特点以及用户体验,为读者提供全方位的了解。1.触摸屏与显示...2025-11-05- 摘要:每个人的名字都是独一无二的,背后蕴含着丰富的文化和命运。而以程依然作为一个名字,同样有着令人惊叹和好奇的故事。通过对以程依然这个名字的姓名学分析,我们可以揭示出他的主要特点和命运走...2025-11-05
- 摘要:随着智能手机技术的不断发展,vivoX510w作为一款性能优异的智能手机备受瞩目。本文将对其进行全面评测,为大家解析其优点和不足之处。外观设计出众,精致与实用并存...2025-11-05
电脑报read错误的解决方法(遇到电脑报read错误如何应对,尝试这些方法解决问题)
摘要:现代社会,电脑已经成为人们生活中不可或缺的工具之一。然而,有时我们可能会遇到电脑报read错误的情况,这给我们的使用体验带来了很大的困扰。本文将为大家介绍一些解决电脑报read错误...2025-11-05红辣椒任性版Max——一款超乎想象的手机体验(感受华为新品,畅享智能生活)
摘要:作为一款备受期待的手机,红辣椒任性版Max将给用户带来怎样的使用体验呢?它了华为的强大技术实力和创新精神,为用户提供了一种前所未有的智能生活方式。本文将为大家详细介绍红辣椒任性版M...2025-11-05

最新评论