轉 內聯函式

2022-08-28 01:21:19 字數 1388 閱讀 8741

傳送門

一、什麼叫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 為提高程式執行速度所進行的一項改進。常規函式與內聯函式之間的區別不在於編寫方式,而在於c 編譯器如何將他們組合到程式裡。c 函式的編譯 與其他程式的 內聯 了起來,也就是說,編譯器將使用相應的函式 代替函式呼叫。對於內聯函式,程式無需調到另乙個位置處執行 再跳回來,因此...

內聯函式 虛函式

在c 中,inline關鍵字和virtual關鍵字分別用來定義c 中的內聯函式和虛函式,他們在各自的場合都有其各自的應用,下面將簡單介紹他們各自的功能,然後在說明為什麼乙個函式不能同時是虛函式和內聯函式 inline 內聯函式的目的是為了減少函式呼叫時間。它是把內聯函式的函式體在編譯器預處理的時候替...