內聯函式inline

2021-09-25 11:44:57 字數 1362 閱讀 3753

在c語言中,使用巨集定義函式這種借助編譯器的優化技術來減少程式的執行時間,在c++中,使用內聯函式這種借助編譯器的優化技術來減少程式的執行時間。

1、內聯函式

在返回值型別前面加上inline關鍵字的函式稱為內聯函式,所有類中定義的函式都預設宣告為內聯函式,虛函式不允許使用內聯,內聯函式在編譯階段發生,當編譯器處理呼叫內聯函式的語句時,不會將該語句編譯成函式指令,而是將整個函式體的**寫入呼叫點,就像整個函式體在呼叫點被重寫了一邊一樣,這是典型的以空間換時間,即增加空間消耗來節省時間,內聯函式不生成符號。

內聯的優點:

1. 內聯函式在編譯階段處理,在呼叫點直接將**展開,相比於普通函式沒有開棧和清棧的開銷,執行效率高。

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

內聯的缺點:

1. 內聯函式在呼叫點直接將**展開,以**膨脹為代價,典型的以空間換時間。

2. 內聯函式具有一定的侷限性,內聯函式的函式體一般來說不能太大,如果內聯函式的函式體過大,一般的編譯器會放棄內聯方式,而採用普通的方式呼叫函式。(換句話說就是,使用內聯函式,只不過是向編譯器提出乙個申請,編譯器可以拒絕你的申請)這樣,內聯函式就和普通函式執行效率一樣了。

2、inline與static的區別

inline和static修飾的函式,函式符號的屬性是乙個local屬性,即在本檔案可見,內聯函式沒有開棧和清棧的開銷,static修飾的函式有開棧和清棧的開銷。

3、內聯與巨集的區別:

內聯在編譯階段發生,會進行型別檢查、安全檢查,巨集在預編譯階段發生,進行文字替換,沒有所謂的型別和安全性檢查,巨集的安全性低(用到引數時應將引數用括號括起來,否則會產生錯誤),可認為內聯是一種更安全的巨集。

4、內聯的注意事項

1、內聯的實現一般寫在標頭檔案.h中。

2、內聯只在release版本生效。

3、內聯函式不包括複雜的控制語句,如迴圈語句、switch語句和遞迴,例如只有乙個包含一兩條語句的迴圈,但該迴圈的執行次數可能會很多,要消耗大量時間,那麼這種情況就不適合將其實現為內聯函式。|

4、內聯函式中的**應該只是很簡單、執行很快的幾條語句。如果乙個函式較為複雜,它執行的時間可能上萬倍於函式呼叫的額外開銷,那麼將其作為內聯函式處理的結果是付出讓**體積增加不少的代價,卻只使速度提高了萬分之一,這顯然是不划算的。

5、內聯只是給編譯器的乙個建議,處不處理,由編譯器根據上下文決定。

6、內聯是基於實現的,而不是宣告的,inline寫在宣告處無效。

inline 內聯函式

一 inline關鍵字用來定義乙個類的內聯函式,引入它的主要原因是用它替代c中表示式形式的巨集定義。表示式形式的巨集定義一例 define expressionname var1,var2 var1 var2 var1 var2 為什麼要取代這種形式呢,且聽我道來 1 首先談一下在c中使用這種形式巨...

inline內聯函式

技術類筆試題50 都會問巨集與inline的區別,自己去找找看?1 巨集替換發生在預編譯 2 巨集函式 如果可以這麼叫的話 替換時不會檢查引數,inline函式會檢查 3 巨集一定會發生替換,inline貌似不是強制的,編譯器想不替換也沒關係 4 巨集替換時存在著一些不可避免的陷阱 參見c trap...

inline內聯函式

一 內聯函式 內聯函式是指用inline關鍵字修飾的函式 它與普通函式所不同之處只在於函式呼叫的處理。普通 函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中 內聯函式不是在呼叫時發生執行權轉移,而是在編譯時將 函式 體 嵌入在每乙個呼叫處。編譯時類似巨集替換,使用 函式體替...