__cdecl,_stdcall,PASCAL,fastcall,_thiscall区别[函数调用方式]
来源:互联网 发布:数据泄密罪名 编辑:程序博客网 时间:2024/05/16 07:56
原文:http://baike.baidu.com/view/1280676.htm
几种函数调用方式
__cdecl 是C DECLaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。
_stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retnX,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。
PASCAL 是Pascal语言的函数调用方式,也可以在C/C++中使用,参数压栈顺序与前两者相反。返回时的清栈方式与_stdcall相同。
_fastcall是编译器指定的快速调用方式。由于大多数的函数参数个数很少,使用堆栈传递比较费时。因此_fastcall通常规定将前两个(或若干个)参数由寄存器传递,其余参数还是通过堆栈传递。不同编译器编译的程序规定的寄存器不同。返回方式和_stdcall相当。 _thiscall 是为了解决类成员调用中this指针传递而规定的。_thiscall要求把this指针放在特定寄存器中,该寄存器由编译器决定。VC使用ecx,Borland的C++编译器使用eax。返回方式和_stdcall相当。 _fastcall 和 _thiscall涉及的寄存器由编译器决定,因此不能用作跨编译器的接口。所以Windows上的COM对象接口都定义为_stdcall调用方式。 C中不加说明默认函数为_cdecl方式(C中也只能用这种方式),C++也一样,但是默认的调用方式可以在IDE环境中设置。 带有可变参数的函数必须且只能使用_cdecl方式,例如下面的函数: int printf(char * fmtStr, ...); int scanf(char * fmtStr, ...); */几种调用约定的区别 几种调用约定的区别 __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。 1、__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈, 2、_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。 3、__fastcall调用约定:它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。 4、thiscall仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。 5、nakedcall采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。naked call不是类型修饰符,故必须和_declspec共同使用。 名字修饰约定 1、修饰名(Decoration name):"C"或者"C++"函数在内部(编译和链接)通过修饰名识别 2、C编译时函数名修饰约定规则: __stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个"@"符号和其参数的字节数,格式为_functionname@number,例如 :function(int a, int b),其修饰名为:_function@8 __cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_functionname。 __fastcall调用约定在输出函数名前加上一个"@"符号,后面也是一个"@"符号和其参数的字节数,格式为@functionname@number。 设置方法 1 可以直接在代码中写 __cdecl 等调用约定 2 在MS-VC++6.0中,调用约定也可以通过工程设置:Setting...\C/C++ \Code Generation项进行选择,缺省状态为__cdecl。名字修饰约定。0
上一篇:JNI内存泄露
下一篇:Function importPackage must be called with a package; had "[JavaClass java.util.ArrayList]"
相关热门文章
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- __cdecl,_stdcall,PASCAL,fastcall,_thiscall区别[函数调用方式]
- __cdecl、_stdcall 、_fastcall、_thiscall 函数调用方式与区别
- 函数调用方式(__cdecl, _stdcall, _fastcall, _thiscall, etc)
- 调用方式 __cdecl _stdcall _fastcall _thiscall
- __cdecl, _stdcall , PASCAL, _fastcall, _thiscall
- _cdecl、_stdcall 、_fastcall、_thiscall 函数调用方式与区别
- 函数调用方式 FAR PASCAL,__cdecl,_stdcall,__pasc
- 函数调用方式 FAR PASCAL,__cdecl,_stdcall,__pasc
- 函数调用方式 FAR PASCAL,__cdecl,_stdcall,__pasc
- 函数调用方法: _cdecl _stdcall PASCAL _fastcall _thiscall
- 函数调用约定 : _stdcall _cdecl fastcall 调用方式详解
- CALLBACK--_stdcall(PASCAL调用方式),VS默认是C语言调用方式即__cdecl
- _stdcall _cdecl fastcall 调用方式详解
- _stdcall _cdecl fastcall 调用方式详解
- _stdcall _cdecl fastcall 调用方式详解
- dll定义与调用中__cdecl __fastcall _fastcall _thiscall区别
- cdecl, stdcall, pascal,fastcall 调用约定区别
- cdecl, stdcall, pascal,fastcall 调用约定区别
- JNI高级教程之数据类型转换
- 浅谈Android开发中内存泄露与优化
- 【总结】JNI使用个人经验
- JNI内存泄露
- 图像处理(十四)图像分割(4)grab cut的图割实现-Siggraph 2004
- __cdecl,_stdcall,PASCAL,fastcall,_thiscall区别[函数调用方式]
- Function importPackage must be called with a package; had "[JavaClass java.util.ArrayList]"
- 动态编译 Java 文件 与 动态加载 Java 类
- 【转载】java class运行时热替换(hotswap)
- springMVC开发中的请求:(1)同步请求
- error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '
- VS2010生成exe在别的机子上运行提示“丢失MSVCR100D.dll”
- 【转】无缝世界网游服务器架构的设计思路
- error LNK2005: _DllMain@12 already defined in MSVCRTD.lib
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
户外灭蚊
驱蚊器哪个牌子好
驱蚊器哪种好
驱蚊器原理
灭蚊虫的灯
白糖水灭蚊子
灭蚊子灯
灭杀蚊子
灭蚊子有什么好办法
专业灭蚊子公司
夏天怎么灭蚊子
灭蚊子的方法
灭蚊子方法
蚊子灭蚊灯
巧灭蚊子
家里怎么灭蚊子
专业灭蚊子
怎样灭蚊子有效又安全
有什么办法灭蚊子
夏天蚊子自制灭蚊神器
用什么灭蚊子
孕妇用什么灭蚊子
怎么样灭蚊子
灭蚊子的绝招
怎样去蚊子
如何去蚊子
怎样杀死蚊子
灭蚊子的办法
杀蚊子药
灭蚊子办法
怎样能灭蚊子
灭蚊子的
有效灭蚊子
花园灭蚊子
用什么杀蚊子
蚊子灭杀
的蚊子
灭蚊子的好方法
吃蚊子的蚊子
灭蚊子用什么
蚊子叮蚊子