C 中函式呼叫的方式

2021-04-29 14:38:25 字數 942 閱讀 2507

一,為什麼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的縮...