內聯函式的理解

2022-08-22 05:39:10 字數 1377 閱讀 4431

一、什麼叫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 放在函式宣告前面不起任何作用。

深入理解內聯函式

內聯函式,看起來像是函式,運作起來像是函式,比巨集要好得多 巨集沒有錯誤檢查等缺點 使用時還不需要承擔函式呼叫的開銷。基本思想 將每個函式呼叫以它的 來替換。但這種做法很可能會增加整個目標 的體積。在一台記憶體有限的計算機裡,過分地使用內聯所產生的程式會因為有太大的體積導致可用空間不夠。即使可以使用...

mysql 內聯函式 Kotlin內聯函式

內聯函式使用關鍵字內聯宣告,內聯函式的使用增強了高階函式的效能。內聯函式告訴編譯器將引數和函式複製到呼叫站點。虛函式或區域性函式不能宣告為內聯。以下是內聯函式內部不支援的一些表示式和宣告 區域性類宣告 內部巢狀類的宣告 函式表示式 宣告區域性函式 區域性可選引數的預設值 讓我們看一下內聯函式的基本示...

內聯函式 C語言的inline內聯函式的作用

編譯器完成的,在呼叫處將函式展開,減少了呼叫函式時 進棧和出棧 壞處是會增加 段的大小 缺點 增加了編譯後的二進位制檔案的大小 為了提高執行的速度,對於一些程式 小,執行時間短但利用次數比較多的函式我們就定義為inline,對於短小的函式,可以省去call儲存現場等操作,提高程式執行速度。原文 分類...