C++函数调用约定(calling convention)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq826364410/article/details/88902296

函数调用约定

告诉编译器用于建栈,参数压栈以及获得返回值的规则。

下面的函数调用约定,那个支持参数长度可变(比如printf)?

A. __cdecl

B. __stdcall

C. __pascal

D. __fastcall

答案:A

所有非C++成员函数和那些没有用__stdcall或__fastcall声明的函数都默认是__cdecl方式,它使用C函数调用方式,函数参数按照从右向左的顺序入栈,函数调用者负责清除栈中的参数,由于每次函数调用都要由编译器产生清除(还原)堆栈的代码,所以使用__cdecl方式编译的程序比使用__stdcall方式编译的程序要大很多,但是__cdecl调用方式是由函数调用者负责清除栈中的函数参数,所以这种方式支持可变参数,比如printf就是__cdecl调用方式。

函数调用约定的几种类型有:__stdcall, __cdecl, __fastcall, __thiscall, __nakedcall, __pascal

下面介绍几种常见的函数调用约定(以VS2010编译器为例):

(1) __cdecl调用约定

1. 参数从右向左传递,放在栈中

2. 栈平衡由调用函数来执行

3. 不定参数的函数可以使用

(2)__stdcall调用约定

1. 参数从右向左传递,放在栈中

2. 栈平衡操作由被调用函数执行

3. 不定参数的函数无法使用

(3)__fastcall调用约定

1. 最左边的两个不大于4字节的参数分别放在ecx和edx寄存器,其余参数仍然从右到左压入栈

2. 被调用方平衡栈

3. 不定参数无法使用

4) __thiscall调用约定

thiscall仅仅用于c++成员函数。this指针存放于ecx寄存器中,参数从右到左压栈,被调用方平衡栈。thiscall不是关键词不能被程序员指定。

猜你喜欢

转载自blog.csdn.net/qq826364410/article/details/88902296
今日推荐