一、什么叫inline函數?
inline(小心,不是online),翻譯成“內聯”或“內嵌”。意指:當編譯器發現某段代碼在調用一個內聯函數時,它不是去調用該函數,而是將該函數的代碼,整段插入到當前位置。這樣做的好處是省去了調用的過程,加快程序運行速度。(函數的調用過程,由於有前面所說的參數入棧等操作,所以總要多占用一些時間)。這樣做的不好處:由於每當代碼調用到內聯函數,就需要在調用處直接插入一段該函數的代碼,所以程序的體積將增大。拿生活現象比喻,就像電視壞了,通過電話找修理工來,你會嫌慢,於是干脆在家里養了一個修理工。這樣當然是快了,不過,修理工住在你家可就要占地兒了。內聯函數並不是必須的,它只是為了提高速度而進行的一種修飾。要修飾一個函數為內聯型,使用如下格式:
inline 函數的聲明或定義
簡單一句話,在函數聲明或定義前加一個 inline 修飾符。
inline int max(int a, int b)
{
return (a>b)? a : 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 放在函數聲明前面不起任何作用。