一、什麼叫inline函式?
inline(小心,不是online),翻譯成「內聯」或「內嵌」。意指:當編譯器發現某段**在呼叫乙個內聯函式時,它不是去呼叫該函式,而是將該函式的**,整段插入到當前位置。這樣做的好處是省去了呼叫的過程,加快程式執行速度。(函式的呼叫過程,由於有前面所說的引數入棧等操作,所以總要多占用一些時間)。這樣做的不好處:由於每當**呼叫到內聯函式,就需要在呼叫處直接插入一段該函式的**,所以程式的體積將增大。拿生活現象比喻,就像電視壞了,通過**找修理工來,你會嫌慢,於是乾脆在家裡養了乙個修理工。這樣當然是快了,不過,修理工住在你家可就要占地兒了。內聯函式並不是必須的,它只是為了提高速度而進行的一種修飾。要修飾乙個函式為內聯型,使用如下格式:
inline 函式的宣告或定義
簡單一句話,在函式宣告或定義前加乙個 inline 修飾符。
inline int max(int a, int b)
內聯函式的本質是,節省時間但是消耗空間。
二、inline函式的規則
(1)、乙個函式可以自已呼叫自已,稱為遞迴呼叫(後面講到),含有遞迴呼叫的函式不能設定為inline;
(2)、使用了複雜流程控制語句:迴圈語句和switch語句,無法設定為inline;
(3)、由於inline增加體積的特性,所以建議inline函式內的**應很短小。最好不超過5行。
(4)、inline僅做為一種「請求」,特定的情況下,編譯器將不理會inline關鍵字,而強制讓函式成為普通函式。出現這種情況,編譯器會給出警告訊息。
(5)、在你呼叫乙個內聯函式之前,這個函式一定要在之前有宣告或已定義為inline,如果在前面宣告為普通函式,而在呼叫**後面才定義為乙個inline函式,程式可以通過編譯,但該函式沒有實現inline。比如下面**片段:
//函式一開始沒有被宣告為inline:
void foo();
//然後就有**呼叫它:
foo();
//在呼叫後才有定義函式為inline:
inline void foo()
**是的foo()函式最終沒有實現inline;
(6)、為了除錯方便,在程式處於除錯階段時,所有內聯函式都不被實現。
三、使用內聯函式時應注意以下幾個問題:
(1) 在乙個檔案中定義的內聯函式不能在另乙個檔案中使用。它們通常放在標頭檔案中共享。
(2) 內聯函式應該簡潔,只有幾個語句,如果語句較多,不適合於定義為內聯函式。
(3) 內聯函式體中,不能有迴圈語句、if語句或switch語句,否則,函式定義時即使有inline關鍵字,編譯器也會把該函式作為非內聯函式處理。
(4) 內聯函式要在函式被呼叫之前宣告。關鍵字inline 必須與函式定義體放在一起才能使函式成為內聯,僅將inline 放在函式宣告前面不起任何作用。
C 內聯函式的說明及使用
在說明內聯函式之前,我們需要先簡單介紹一下函式的執行過程。我們寫的 最終會被編譯成可執行程式,這些程式是機器可以識別的機器語言,然後當我們執行程式時,這些 被載入到記憶體當中。一般在呼叫函式時,函式呼叫後立即儲存該指令的記憶體位址,並把函式的引數拷貝到堆疊空間,然後程式跳轉到該函式起點的記憶體單元,...
內聯函式 普通函式 巨集定義
對於乙個頻繁使用的短小函式,c用巨集定義,c 用inline實現。一 巨集定義和內聯函式 內聯函式和普通函式的區別 1 巨集定義只是普通的文字替換,巨集定義是沒有型別檢查的,無論對還是錯都是直接替換。所以巨集替換容易出錯,直接替換會產生符號的優先順序的問題會一些意想不到的結果。內聯函式在編譯的時候會...
內聯函式和巨集定義
在c中,我們常用巨集定義來達到優化速度的目的,但由於巨集定義的種種缺陷 大家應該都吃過這種苦吧 在c 中引入了內聯函式。內聯函式實現了巨集的概念,任何在類內定義的函式會自動的成為內聯函式,但是也可以在類外用inline關鍵字來定義內聯函式。內聯的目的和巨集一樣是為了減少函式呼叫的開銷,但是通常我們會...