VC++学习笔记之函数调用约定
参考文章:http://blog.csdn.net/thimin/article/details/1529386
调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议。这种协议规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题。
调用约定是用来修饰函数的,其使用格式为
函数返回值 调用约定 函数名(函数参数){
函数主体;
}
在C++中,函数调用约定主要有以下几种:
1、_cdecl
__cdecl是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。
int _cdecl max(int a,int b){
return a>b ? a :b;
}
2、_stdcall
__stdcall调用约定用于调用Win32 API函数。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。
int _stdcall max(int a,int b){
return a>b ? a :b;
}
3、_fastcall
__fastcall约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。
int _fastcall max(int a,int b,int c){
return a>b ? (a>c ? a : c) : (b>c ? b : c);
}
还没有评论,来说两句吧...