c 再學習(內聯函式)

2021-09-26 08:12:49 字數 1684 閱讀 7260

什麼是內聯函式?

以inline修飾的函式叫做內聯函式,編譯時c++編譯器會在呼叫內聯函式的地方展開,沒有函式壓棧的開銷,內聯函式提公升程式執行的效率。

內聯函式與普通函式執行過程有何不同?

普通函式的執行過程中,首先要儲存暫存器的位置,然後傳入引數——這時程式轉到函式處執行,然後再返回,而內聯函式不需要這麼做,編譯器會在程式執行前把函式嵌入,執行時程式順序進行,不需要前往函式處。

什麼樣的函式適合寫成內聯函式?

從寫程式的角度上來說,似乎任何函式都可以加上inline,但實際上,編譯器並不允許過於複雜的函式被寫成內聯函式。

以下摘自《高質量程式設計指南——c++/c語言》:

而在google c++編碼規範中則規定得更加明確和詳細:

內聯函式:

tip: 只有當函式只有 10 行甚至更少時才將其定義為內聯函式.

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

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

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

結論: 乙個較為合理的經驗準則是, 不要內聯超過 10 行的函式. 謹慎對待析構函式, 析構函式往往比其表面看起來要更長, 因為有隱含的成員和基類析構函式被呼叫!

另乙個實用的經驗準則: 內聯那些包含迴圈或 switch 語句的函式常常是得不償失 (除非在大多數情況下, 這些迴圈或 switch 語句從不被執行).

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

-inl.**件:

tip: 複雜的內聯函式的定義, 應放在字尾名為 -inl.h 的標頭檔案中.

內聯函式的定義必須放在標頭檔案中, 編譯器才能在呼叫點內聯展開定義. 然而, 實現**理論上應該放在 .cc 檔案中, 我們不希望 .h 檔案中有太多實現**, 除非在可讀性和效能上有明顯優勢.

如果內聯函式的定義比較短小, 邏輯比較簡單, 實現**放在 .h 檔案裡沒有任何問題. 比如, 訪問函式的實現理所當然都應該放在類定義內. 出於編寫者和呼叫者的方便, 較複雜的內聯函式也可以放到 .h 檔案中, 如果你覺得這樣會使標頭檔案顯得笨重, 也可以把它萃取到單獨的 -inl.h 中. 這樣把實現和類定義分離開來, 當需要時包含對應的 -inl.h 即可。

為什麼要把這些函式寫為內聯?

一,有時我們希望寫出乙個單獨可以復用的模組,這樣也方便修改。

二,增強程式的可讀性和可理解性。

內聯函式與巨集之間有什麼不同?如何選擇這兩者?

正如上述鏈結所說,內聯函式是巨集的公升級,巨集是由預處理器進行處理的,而內聯函式則由編譯器處理。內聯函式的處理在巨集之後,相比起巨集定義的對等替換,內聯函式的值傳遞更加安全。

我在寫作這篇文章時參考了內聯函式與巨集函式的區別和c++ 內聯函式 (講解的tm真好),非常感謝兩位大手子。

C語言再學習 函式

一 函式概述 1 首先什麼是函式?函式是用於完成特定任務的程式 的自包含單元。2 為什麼使用函式?第 一 函式的使用可以身故重複 的編寫。第 二 函式使得程式更加模組化,有利於程式的閱讀修改和完善。3 main函式原型 int main int argc,char argv,char envp 第乙...

C 學習 內聯函式

巨集 可以做兩件事情 1 定義常量 2 定義函式 define a 10 define add x,y x y c 建議用 1 const 替換巨集常量 2 用 內聯函式 替換巨集函式 內聯函式定義 在函式定義前加 inline 關鍵字 注意 在宣告前加無效 巨集函式是在預處理期間進行處理 內聯函式...

學習筆記 C 內聯函式

對於乙個頻繁使用的短小函式,在c語言中應該用巨集定義實現,在c 中用inline實現。巨集定義與內聯函式的不同用法000。在c語言中,寫一手漂亮的巨集定義是非常有必要的,方式出錯 提高 的移植性和可讀性等。尤其是一些常用或通用的功能函式或者 段,這些功能既可以寫成函式,也可以封裝為巨集定義。就功能性...