C++函数调用有三种常见方式:thiscall,__cdecl,__stdcall
成都创新互联公司主要为客户提供服务项目涵盖了网页视觉设计、VI标志设计、营销推广、网站程序开发、HTML5响应式重庆网站建设、成都手机网站制作、微商城、网站托管及成都网站维护、WEB系统开发、域名注册、国内外服务器租用、视频、平面设计、SEO优化排名。设计、前端、后端三个建站步骤的完善服务体系。一人跟踪测试的建站服务标准。已经为VR全景行业客户提供了网站改版服务。
今天看了篇介绍的文章,才比较清楚了点。thiscall,用于类的成员函数调用,
__thiscall对每个函数都增加了一个类指针参数
class aa
{
void bb(int cc);
};
实际上bb的函数原形是void bb(aa this, int cc);
以前知道类的成员函数在调用时会传入一个this指针,而不晓得thiscall就是专门指定了这种调用方式。__cdecl调用方式即为C,C++默认的调用方式。
void Input( int m,int n);/*相当于void __cdecl Input(int m,int n);*/
其特点是:1,由主调用函数进行参数压栈并且恢复堆栈;2,在主调用函数中进行实参的压栈并且顺序是从右到左;3,由于主调用函数管理堆栈,所以可以实现变参函数。
__stdcall则是标准调用方式,实际上就是PASCAL,CALLBACK,WINAPI ,其特点是:_主调用函数中负责压栈,在被调用函数中负责弹出堆栈中的参数,并且负责恢复堆栈。因此不能实现变参函数,参数传递是从右到左。另外,命名修饰方法是在函数前加一个下划线(_),在函数名后有符号(@),在@后面紧跟参数列表中的参数所占字节数(10进制),如:void Input(int m,int n),被修饰成:_Input@8 。
函数调用有俩种情况
1:声明函数,然后直接在函数体内调用函数,这样的做法是先保存当前函数执行的地址,然后查找函数指针,找到函数声明,再找到函数实现,创建一个函数堆栈,直接在函数堆栈里面操作,然后将返回值传给主函数。然后通过之前保存的地址,继续执行之后的代码。过程比较复杂。
2:内联函数和动态库调用,这俩种方法的函数调用比较奇特,他们不会创建单独的函数堆栈,而是执行到内联函数和动态库调用区域,直接将这部分代码,类似于“粘贴”到主函数中,省去了保存当前代码执行地址,等等一系列的操作,省去了很多内存空间,增加带代码的执行效率。适合于保存一些使用频率很高的小代码。能节省很多的程序运行时间。
在C语言中,可以用以下几种方式调用函数:
1. 函数表达式:
2. 函数语句:
3. 函数实参;
函数的嵌套调用