1. 基本概念
调用约定
调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议。这种协议规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题。不同的语言定义了不同的调用约定。
名称修饰
在C++中,为了允许操作符重载和函数重载,C++编译器往往按照某种规则改写每一个入口点的符号名,以便允许同一个名字(具有不同的参数类型或者是不同的作用域)有多个用法,而不会打破现有的基于C的链接器。这项技术通常被称为名称改编(Name Mangling)或者名称修饰(Name Decoration)。许多C++编译器厂商选择了自己的名称修饰方案。
2. 调用约定
2.1 __cdecl
C/C++和MFC程序默认使用的调用方式,参数个数可变,由函数调用者清栈(定义部分不知道参数数量,故无法处理)
2.2 __stdcall
用于调用Win32 API函数。参数个数固定,函数在返回前清空传递参数的堆栈。
2.3 __fastcall
用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节的参数分别放在ECX
和EDX
寄存器,其余的参数仍旧自右向左压栈传递,被调用函数在返回前清理传递参数的堆栈。
关键字 __cdecl
、__stdcall
、__fastcall
可以直接加在要输出的函数前,也可以在编译器的命令行参数设置,分别对应为 /Gd
、/Gz
、/Gr
。缺省状态为