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

函数调用约定

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

 

下面的函数调用约定,那个支持参数长度可变(比如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不是关键词不能被程序员指定。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值