C++函數調用有三種常見方式:thiscall,__cdecl,__stdcall
成都創(chuàng)新互聯公司主要為客戶提供服務項目涵蓋了網頁視覺設計、VI標志設計、營銷推廣、網站程序開發(fā)、HTML5響應式重慶網站建設、成都手機網站制作、微商城、網站托管及成都網站維護、WEB系統(tǒng)開發(fā)、域名注冊、國內外服務器租用、視頻、平面設計、SEO優(yōu)化排名。設計、前端、后端三個建站步驟的完善服務體系。一人跟蹤測試的建站服務標準。已經為VR全景行業(yè)客戶提供了網站改版服務。
今天看了篇介紹的文章,才比較清楚了點。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 ,其特點是:_主調用函數中負責壓棧,在被調用函數中負責彈出堆棧中的參數,并且負責恢復堆棧。因此不能實現變參函數,參數傳遞是從右到左。另外,命名修飾方法是在函數前加一個下劃線(_),在函數名后有符號(@),在@后面緊跟參數列表中的參數所占字節(jié)數(10進制),如:void Input(int m,int n),被修飾成:_Input@8 。
函數調用有倆種情況
1:聲明函數,然后直接在函數體內調用函數,這樣的做法是先保存當前函數執(zhí)行的地址,然后查找函數指針,找到函數聲明,再找到函數實現,創(chuàng)建一個函數堆棧,直接在函數堆棧里面操作,然后將返回值傳給主函數。然后通過之前保存的地址,繼續(xù)執(zhí)行之后的代碼。過程比較復雜。
2:內聯函數和動態(tài)庫調用,這倆種方法的函數調用比較奇特,他們不會創(chuàng)建單獨的函數堆棧,而是執(zhí)行到內聯函數和動態(tài)庫調用區(qū)域,直接將這部分代碼,類似于“粘貼”到主函數中,省去了保存當前代碼執(zhí)行地址,等等一系列的操作,省去了很多內存空間,增加帶代碼的執(zhí)行效率。適合于保存一些使用頻率很高的小代碼。能節(jié)省很多的程序運行時間。
在C語言中,可以用以下幾種方式調用函數:
1. 函數表達式:
2. 函數語句:
3. 函數實參;
函數的嵌套調用