您的位置:首页 > 其它

__stdcall __cdecl 在不同平台上的区别

2011-06-16 00:11 281 查看
在Windows PC上 可以控制默认的调用约定:以VS2008 C++为例,在项目属性的C/C++的高级里面可以设置;

在WinCE 上 默认就是__stdcall 没得设置默认项!

Calling Convention

Calling Convention是指程序在函数调用时传递参数和获取返回值所采用的方法:通过寄存器、或通过栈、或者是两者的混合。
在Visual C++中,用于指定Calling Convention的修饰符主要有:__cdecl, __stdcall, __fastcall等。它们各自的特征如下:

C Calling Convention __cdecl:
1> 参数按从右到左的顺序传递,放于栈中
2> 栈的清空由主调函数完成
3> 在生成的汇编代码中,函数名以下划线 _ 开头
编译选项:/Gd
对于变参函数,如printf,只能用这种方式

Standard calling Conventions __stdcall:
1> 参数按从右到左的顺序传递,放于栈中
2> 栈的清空由被调函数完成
3> 在生成的汇编代码中,函数名以下划线 _ 开头,以@和所有参数所占用的字节数结尾。如 call _sumExample@8
编译选项:/Gz
Win32程序中的WINAPI即是__stdcall:#define WINAPI __stdcall
由于栈是由被调函数自己清空,其产生的执行代码要小于__cdecl方式所产生的代码

Fast Calling Convention __fastcall:
1> 前两个参数要求不超过32bits,分别放入ECX和EDX,其余参数按从右到左的顺序传递,放于栈中
2> 参数由被调函数弹出栈
3> 在生成的汇编代码中,函数名以@开头,以@和所有参数所占用的字节数结尾
M$有可能将前两个参数放在不同的寄存器中
编译选项:/Gr

除这三种之外,还有Thiscall,但它仅用于C++中类的成员函数:
1> 参数按从右到左的顺序传递,放于栈中。this放于ECX中
2> 栈的清空有被调函数完成
这是C++中类成员函数默认的calling convention。但如果类的成员函数包含可变参数,那该函数的call convention则是__cdecl

在MSDN中还描述了一种修饰符__clrcall,适用于托管代码!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: