




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第C語言三種函數(shù)調(diào)用約定目錄C語言常用的調(diào)用約定一、_cdecl調(diào)用約定二、_stdcall調(diào)用約定三、_fastcall調(diào)用約定總結(jié)
C語言常用的調(diào)用約定
以下就是C語言常用的三種調(diào)用約定:
調(diào)用約定參數(shù)壓棧順序平衡堆棧__cdecl從右往左依次入棧調(diào)用者清理堆棧__stdcall從右往左依次入棧自身清理堆棧__fastcallECX/EDX傳遞前兩個參數(shù)剩下的從右往左依次入棧自身清理堆棧
下面會舉例為大家講解三種調(diào)用約定的區(qū)別。
一、_cdecl調(diào)用約定
這是C語言默認的調(diào)用約定,使用的平棧方式為外平棧
示例代碼:
以下代碼不使用任何調(diào)用約定,讓我們來看看函數(shù)默認的調(diào)用約定是什么。
#includestdio.h
intmethod(intx,inty)
returnx+y;
intmain()
__asmmoveax,eax;//此處設(shè)置斷點
method(1,2);
return0;
}
編譯、調(diào)試、ALT+8調(diào)出反匯編如下:
根據(jù)上面這張圖的描述,默認的約定很符合__cdecl約定。
使用cdecl約定,如下:
vs2010:Ctrl+Alt+F7重新生成、F5調(diào)試、ALT+8查看反匯編:
一模一樣,可以看出__cdecl就是C語言默認的調(diào)用約定。
二、_stdcall調(diào)用約定
和__cdecl一樣都是從右往左入棧參數(shù),不過該調(diào)用約定使用的平棧方式是內(nèi)平棧
示例代碼:
Ctrl+Alt+F7重新生成、F5調(diào)試、ALT+8查看反匯編:
可以看到,這里已經(jīng)看不到堆棧的處理了。
F11不斷執(zhí)行,直到進入call指令調(diào)用的method函數(shù)中:
平棧操作跑到函數(shù)內(nèi)部了,__cdecl約定是調(diào)用者(main)函數(shù)進行平棧,而__stdcall約定是函數(shù)內(nèi)部自身進行平棧。
三、_fastcall調(diào)用約定
這是一個比較特殊的調(diào)用約定,當函數(shù)參數(shù)為兩個或者以下時,該約定的效率遠遠大于上面兩種,當然隨著參數(shù)越來越多,該約定與上面兩種約定的差距逐漸縮小。
證明如下:
首先,我們使用__fastcall調(diào)用約定并傳入兩個參數(shù)。
重新生成、調(diào)試、匯編:
F11進入函數(shù)內(nèi)部查看:
可以看出函數(shù)內(nèi)部和外部都沒有清理堆棧的操作。
這也就是__fastcall效率高的原因。
因為寄存器就是屬于cpu的,然后堆棧是內(nèi)存,使用cpu進行操作的效率肯定會大于使用內(nèi)存,所以我們使用寄存器的效率肯定比push傳參效率高很多啊。
那么為什么沒有平棧操作呢?
因為我們沒有使用堆棧啊,我們只是用了寄存器,并沒有使用堆棧操作。
但是當我們傳入更多的參數(shù)的時候就需要用到堆棧了,因為__fastcall他只給我們提供了兩個寄存器ECX/EDX可以用來傳參。
四個參數(shù)試試:
重新生成、調(diào)試、匯編:
F11進入函數(shù)內(nèi)部查看:
通過四個參數(shù)的傳遞,證明了:
函數(shù)參數(shù)除了前兩個參數(shù)使用寄存器、其他的依舊使用堆棧從右往左傳參,并且是自身清理堆棧,不是調(diào)用者清理。
思考為什么參數(shù)越來越多的時候,__fastcall與其他調(diào)用約定的差距越來越小呢?
答:首先我們知道了使用寄存器(cpu)的效率遠遠大于使用堆棧(內(nèi)存),然而__fastcall約定也只能使用兩個寄存器,當函數(shù)參數(shù)只有兩個時,__fastcall可以完全使用寄存器進行函數(shù)傳參,所以這個時候他和__cdecl和__stdcall的差距最大。隨著參數(shù)越來越多,__fastcall依舊只能使用兩個寄存器,這樣一來參數(shù)越多,__fastcall使用內(nèi)存的占比就越大,所以性能差距也就越來越小。
總結(jié)
以上的內(nèi)容匯總?cè)缦拢?/p>
調(diào)用約定參數(shù)壓棧順序平衡堆棧調(diào)用約定特點__cdecl從右往左依次入棧調(diào)用者清理堆棧這是C語言默認的調(diào)用約定,使用的平棧方式為外平棧__stdcall從右往左依次入棧自身清理堆棧和__cdecl一樣都是從右往左入棧參數(shù),不過該調(diào)用約定使用的平棧方式是內(nèi)平棧__fastcallECX/ED
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江國企招聘2025溫州平陽縣城發(fā)集團下屬房開公司招聘5人筆試參考題庫附帶答案詳解
- 宜賓五糧液股份有限公司2025年上半年社會招聘(11人)筆試參考題庫附帶答案詳解
- 2025湖南興湘科技創(chuàng)新公司招聘6人筆試參考題庫附帶答案詳解
- 2025河南許昌煙機公司招聘30人筆試參考題庫附帶答案詳解
- 2025江蘇蘇州日創(chuàng)包裝材料有限公司緊急招聘3人筆試參考題庫附帶答案詳解
- 2025四川雅安市寶興縣興綠林業(yè)投資有限公司招聘6人筆試參考題庫附帶答案詳解
- 科產(chǎn)教融合助力特色育人模式創(chuàng)新與實施
- 駕校項目商業(yè)策劃方案
- 高性能滌綸纖維的市場前景試題及答案
- 拆除居間合同協(xié)議書范本
- 2023-2024學(xué)年人教版數(shù)學(xué)八年級下冊期中復(fù)習(xí)卷
- (高清版)TDT 1044-2014 生產(chǎn)項目土地復(fù)墾驗收規(guī)程
- 2024新人教版初中英語單詞表匯總(七-九年級)中考復(fù)習(xí)必背
- 生物知識競賽活動方案
- MBA-組織行為學(xué)課件
- 白云枕頭-模板參考
- 奧迪汽車介紹
- 心衰超濾治療
- 設(shè)備管理案例綜合經(jīng)驗
- 發(fā)現(xiàn)人生的閃光點主題班會課件
- 司法鑒定專題培訓(xùn)課件
評論
0/150
提交評論