inline函式和 define巨集定義簡單講解

2021-10-02 01:50:10 字數 1507 閱讀 7108

在c語言,實際上inline的出現是為了填補巨集定義的缺點。

巨集定義是在編譯器預編譯的時候把define定義的關鍵字進行替換。

巨集定義的好處是巨集定義在形式及使用上像乙個函式,但它使用預處理器實現,沒有了引數壓棧,**生成等一系列的操作。

因此,效率很高,這是它在c中被使用的乙個主要原因。

1.inline定義的類的內聯函式,函式的**被放入符號表中,在使用時直接進行替換(像巨集一樣展開),沒有了呼叫的開銷,效率也很高。

2.很明顯,類的內聯函式也是乙個真正的函式,編譯器在呼叫乙個內聯函式時,會首先檢查它的引數的型別,保證呼叫正確。然後進行一系列的相關檢查,就像對待任何乙個真正的函式一樣。這樣就消除了它的隱患和侷限性。

比如乙個函式呼叫另乙個函式:需要分配棧空間壓棧執行出棧幾個過程;

使用巨集定義和inline可以直接在該函式**展開執行,並無上述過程,非常高效。

如果不看執行結果,在我們直觀程式覺得上述**輸出運算結果應該是一樣的,等於6。

結論:一、首先能確定的是巨集定義和inline在函式直接展開執行的,即都是**替換,並無呼叫函式的過程;(有疑問可反彙編看)

巨集定義**等效於:def_fun(1 + 2) = 1 + 2 * 2 = 5, 原因就是:在預編譯的時候x會替換成1+2,但是由於運算子優先順序不同, * 號的優先順序比 + 號高,故先乘後加,結果等於5。

而使用inline的函式在編譯器在呼叫乙個內聯函式時,會像函式一樣檢查引數,確保無誤。

故你看到上圖引數在inline函式執行的時候已經把 1 + 2 = 3,  這個x的結果3先運算出來,再展開執行。

所以算出來的結果是6。

最後,內聯函式和巨集定義注意事項:

內聯是以**膨脹複製為代價,僅僅省去了函式呼叫的開銷,從而提高函式的執行效率。

1、對於頻繁使用的幾句c語言語句,不使用推薦使用內聯函式和巨集定義,雖然內聯函式和巨集定義高效,但是頻繁使用會導致**空間膨脹。

擴充套件:

static __forceinline:靜態強制內聯,加上static修飾只是限制該內聯函式的使用的作用域,使用場景指有些編譯器優化過程中會對內聯函式出現警告或者錯誤,畢竟內聯是以**膨脹複製為代價,提高效率的。故固執的程式猿會使用強制內聯函式。

全篇完。

本人部落格僅僅代表我個人見解方便記錄成長筆記。

若有與 看官老爺見解有衝突,我堅信看官老爺見解是對的,我的是錯的。

感謝~!

inline和define的特點和區別

一 內聯函式inline 函式呼叫時都會產生一些額外的開銷,主要是系統棧的保護 的傳遞 系統棧的恢復以及引數傳遞等。對於那些函式體很小 執行時間很短但又頻繁使用的函式,定義為內聯函式提高函式呼叫的效率。內聯函式不是在呼叫時發生轉移,而是在編譯時將函式體嵌入到每個內聯函式呼叫處。這樣就省去了引數傳遞 ...

C中 define和inline的區別

c中巨集定義和內聯函式的區別是很容易讓人忽視的乙個地方,也是面試的時候經常被提起的乙個問題。前幾天寫 的時候由於對巨集定義乙個細節的忽視,導致程式執行總是出錯。現在把巨集定義可能出現的問題總結一下。出錯的 結構如下 cpp view plain copy if rlc dc bit msk data...

define與inline的區別

define成為 巨集 在c語言程式設計中非常重要,它在程式編譯時只是在預處理的過程中實施簡單的替換操作而已。由於在替換過程中可能出現的各種不安全性問題,在c 提倡採用const或者inline 內聯函式 的方式替代巨集。內聯函式和普通函式相比可以加快程式的執行速度,但它是以增加程式儲存空間維代價的...