VC++学习笔记之函数调用约定

约定不等于承诺〃 2022-09-22 15:53 268阅读 0赞

参考文章: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);

}

发表评论

表情:
评论列表 (有 0 条评论,268人围观)

还没有评论,来说两句吧...

相关阅读

    相关 VC++学习笔记HelloWorld

    本系列文章记录我学习VC++的过程。 一直以来我对自己的定位是C++工程师,但到目前为止我对C++的了解还停留在C阶段,只会用C的特性加上面向对象的知识写一点控制台程序,要我

    相关 函数调用约定与区别

          在调用成员函数之前,必须先把参数压到栈中,然后再进入成员函数中,成员函数依次把参数从栈中取出来,在函数返回之前或返回之后,必须恢复栈的当前位置,才能保证程序的正常运