码迷,mamicode.com
首页 > 编程语言 > 详细

C++技术问题总结-第13篇 调用约定有哪些,有什么不同

时间:2014-12-12 13:24:06      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:调用约定

调用约定(Calling convention),决定以下内容:

a. 函数参数的压栈顺序。

b. 由调用者还是被调用者把参数弹出栈。

c. 以及产生函数修饰名的方法。

 

常用的调用约定为__stdcall__cdecl__fastcall

1) __stdcall

StandardCall的缩写,约定内容:

a. 参数从右向左压入堆栈。

b. 函数被调用者修改堆栈。

c. 输出函数名前加上一个下划线前缀,后面加上一个"@"符号和其参数的字节数,格式为_functionname@number,例如 :function(int a, int b),其修饰名为:_function@8

 

通常用于Win32 Api主要见于Microsoft Visual CC++

对应宏定义:#define WINAPI __stdcall

 

2) __cdecl

C Declaration的缩写,约定内容:

a. 参数从右到左入栈。

b. 调用者清除栈,俗称手动清栈。

c. 输出函数名前加上一个下划线前缀,格式为_functionname

 

__cdeclC/C++语言默认的函数调用方法。

 

3) __fastcall

为了提高调用速度,将前两个(或若干个)参数由寄存器传递,其余参数还是通过堆栈传递。

快速调用,约定内容:

a. 参数从右向左压入堆栈。

b. 函数被调用者修改堆栈。

c. 输出函数名前加上一个"@"符号,后面也是一个"@"符号和其参数的字节数,格式为@functionname@number

 

不同编译器编译的程序规定的寄存器不同。在Intel x86平台上,使用ECXEDX寄存器。使用__fastcall方式无法用作跨编译器的接口。

C++技术问题总结-第13篇 调用约定有哪些,有什么不同

标签:调用约定

原文地址:http://blog.csdn.net/segen_jaa/article/details/41891615

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!