一,為什麼c++的要有不同的函式呼叫方式
c++採用引數壓棧的方式來進行函式呼叫:
呼叫者依次把引數壓棧,然後呼叫函式。
函式被呼叫以後,在堆疊中取得資料,並進行計算。
函式計算結束以後,或者呼叫者、或者函式本身修改堆疊,使堆疊恢復原裝。
因此,有這幾個問題需要明確:
函式呼叫時引數需要以什麼樣的方式進行傳遞。對於不同的函式呼叫,引數的傳遞方式應該採取不同的方式對待,以使得其呼叫的效率盡可能得高。
呼叫結束時系統堆疊要由誰來清除。不同的編譯器產生棧的方式不盡相同,那麼呼叫者能否正常的完成清除工作呢?答案是不能。
由此,c++的函式呼叫方式一共分五種:
stdcall ,cdecl ,fastcall ,thiscall ,naked call
二,c++幾種主要的函式傳遞方式:
2.1 __stdcall
__stdcall是c++最常用的引數呼叫方式了。也許你認為你見得還不夠多,那麼請看下列標頭檔案:
其實我們通常看到的winapi,callback,apientry 都是__stdcall的呼叫方式。
__stdcall呼叫方式具有如下特點:
__stdcall的呼叫方式的優點是函式自己清棧。這樣上面的問題就解決了,呼叫方不需要幫助函式清理堆疊,呼叫就方便多了。在跨平台的開發或者呼叫中,都採用__stdcall。
2.2 _cdecl
雖然__stdcall非常強大,但是依然有它無法處理的特例。典型的,就是printf()函式。
printf是個不定長引數的函式,因此函式方無法知道引數的長度,只有呼叫方知道,因此函式方面無法完成堆疊的清理工作。
_cdecl呼叫方式具有如下特點:
c 各種 建構函式的呼叫方式
c 的類中有5種值得注意的基本的函式 可以通過乙個例子來說明,假如我現在有乙個animal類,其中為了除錯,我特意在每個建構函式中加入了輸出語句,來看看呼叫的結果 struct animal animal string name,int age animal const animal other a...
C 中建構函式的手動和自動呼叫方式
1,物件的構造通過建構函式來完成,和類名相同且沒有返回值,這個時候只有參 數乙個特性,建構函式可以自定義引數,這個引數一般而言就是對類進行初始 化來使用的 帶有引數的建構函式的意義在於可以使得每個物件有不同的初始 化狀態 生活中每個事物必然包含自己的初始化狀態,不如人的出生,面向對 象用來將生活中的...
函式呼叫方式
cdecl 是c declaration的縮寫,表示c語言預設的函式呼叫方法 所有引數從右到左依次入棧,這些引數由呼叫者清除,稱為手動清棧。被呼叫函式不需要求呼叫者傳遞多少引數,呼叫者傳遞過多或者過少的引數,甚至完全不同的引數都不會產生編譯階段的錯誤。stdcall 是standard call的縮...