1. 程式人生 > >c++:行內函數

c++:行內函數

行內函數inline:

引入行內函數的目的是為了解決程式中函式呼叫的效率問題,這麼說吧,程式在編譯器編譯的時候,編譯器將程式中出現的行內函數的呼叫表示式用行內函數的函式體進行替換,而對於其他的函式,都是在執行時候才被替代。這其實就是個空間代價換時間的節省。所以行內函數一般都是不超過10行的小函式。

一個函式是內聯的,那麼在編譯時,編譯器會把該函式的程式碼副本放置在每個呼叫該函式的地方。對行內函數進行任何修改,都需要重新編譯函式的所有客戶端,因為編譯器需要重新更換一次所有的程式碼,否則將會繼續使用舊的函式。如果想把一個函式定義為行內函數,則需要在函式名前面放置關鍵字 inline,在呼叫函式之前需要對函式進行定義。如果已定義的函式多於一行,編譯器會忽略 inline 限定符。

c++行內函數通常與類一起使用。在類定義中的定義的函式都是行內函數,即使沒有使用 inline 說明符。

幾點tips:

當函式被宣告為行內函數之後, 編譯器會將其內聯展開, 而不是按通常的函式呼叫機制進行呼叫.

優點: 當函式體比較小的時候, 內聯該函式可以令目的碼更加高效. 對於存取函式以及其它函式體比較短, 效能關鍵的函式, 鼓勵使用內聯.

缺點: 濫用內聯將導致程式變慢. 內聯可能使目的碼量或增或減, 這取決於行內函數的大小. 內聯非常短小的存取函式通常會減少程式碼大小, 但內聯一個相當大的函式將戲劇性的增加程式碼大小. 現代處理器由於更好的利用了指令快取, 小巧的程式碼往往執行更快。

結論: 不要內聯超過 10 行的函式. 謹慎對待解構函式, 解構函式往往比其表面看起來要更長, 因為有隱含的成員和基類解構函式被呼叫!

內聯那些包含迴圈或 switch 語句的函式常常是得不償失 (除非在大多數情況下, 這些迴圈或 switch 語句從不被執行.

有些函式即使宣告為內聯的也不一定會被編譯器內聯, 這點很重要; 比如虛擬函式和遞迴函式就不會被正常內聯. 通常, 遞迴函式不應該宣告成行內函數.(遞迴呼叫堆疊的展開並不像迴圈那麼簡單, 比如遞迴層數在編譯時可能是未知的, 大多數編譯器都不支援內聯遞迴函式). 虛擬函式內聯的主要原因則是想把它的函式體放在類定義內, 為了圖個方便, 抑或是當作文件描述其行為, 比如精短的存取函式.