inline


inline定義格式

一、inline 關鍵字用來定義一個類的 內聯函數,引入它的主要原因是用它替代C中 表達式形式的 宏定義
表達式形式的宏定義如:
#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))
取代這種形式的原因如下:
1.C中使用define這種形式宏定義的原因是因為,C語言是一個效率很高的語言,這種宏定義在形式及使用上像一個函數,但它使用 預處理器實現,沒有了參數壓棧, 代碼生成等一系列的操作。因此,效率很高,這是它在C中被使用的一個主要原因。
2.這種 宏定義在形式上類似於一個函數,但在使用它時,僅僅只是做預處理器 符號表中的簡單替換,因此它不能進行參數有效性的檢測,也就不能享受C++ 編譯器嚴格類型檢查的好處,另外它的返回值也不能被強制轉換為可轉換的合適的類型。這樣,它的使用就存在着一系列的隱患和局限性。
3.在C++中引入了類及類的訪問控制,這樣,如果一個操作或者說一個 表達式涉及到類的保護成員或私有成員,你就不可能使用這種宏定義來實現(因為無法將this 指針放在合適的位置)。
4.inline推出的目的,也正是為了取代這種表達式形式的 宏定義,它消除了宏定義的缺點,同時又很好地繼承了宏定義的優點。
預定義
對應於上面的1-3點,闡述如下:
1.inline定義的類的 內聯函數,函數的代碼被放入 符號表中,在使用時直接進行替換(像宏一樣展開),沒有了調用的開銷,效率也很高。
2.很明顯,類的內聯函數也是一個真正的函數, 編譯器在調用一個內聯函數時,會首先檢查它的參數的類型,保證調用正確。然后進行一系列的相關檢查,就像對待任何一個真正的函數一樣。這樣就消除了它的隱患和局限性。
3.inline可以作為某個 類的成員函數,當然就可以在其中使用所在類的保護成員及私有成員。
在何時使用inline函數:
首先,你可以使用inline函數完全取代 表達式形式的宏定義。
另外要注意, 內聯函數一般只會用在函數內容非常簡單的時候。這是因為,內聯函數的代碼會在任何調用它的地方展開,如果函數太復雜,代碼膨脹帶來的惡果很可能會大於效率的提高帶來的益處。內聯函數最重要的使用地方是用於類的存取函數
 

功能及注意事項

編輯  語音
(1)內聯函數的作用
●對於內聯函數,C++有可能直接用函數體代碼來替代對函數的調用,這一過程稱為函數體的內聯展開。
●對於只有幾條語句的小函數來說,與函數的調用、返回有關的准備和收尾工作的代碼往往比函數體本身的代碼要大得多。因此,對於這類簡單的、使用頻繁的小函數,將之說明為內聯函數可提高運行效率。  [3]
(2)慎用內聯函數
內聯是以代碼膨脹復制為代價,僅僅省去了函數調用的開銷,從而提高函數的執行效率。如果執行函數體內代碼的時間,相比於函數調用的開銷較大,那么效率的收獲會很少。另一方面,每一處內聯函數的調用都要復制代碼, 將使程序的總代碼量增大,消耗更多的內存空間。以下情況不宜使用內聯:
1)如果函數體內的代碼比較長,使用內聯將導致內存消耗代價較高。
2)如果函數體內出現循環,那么執行函數體內代碼的時間要比函數調用的開銷大。  [4] 

內聯函數與一般函數區別

編輯  語音
1)內聯含函數比一般函數在前面多一個inline修飾符。
2)內聯函數是直接復制“鑲嵌”到主函數中去的,就是將內聯函數的代碼直接放在內聯函數的位置上,這與一般函數不同,主函數在調用一般函數的時候,是指令跳轉到被調用函數的入口地址,執行完被調用函數后,指令再跳轉回主函數上繼續執行后面的代碼;而由於內聯函數是將函數的代碼直接放在了函數的位置上,所以沒有指令跳轉,指令按順序執行。
3)一般函數的代碼段只有一份,放在內存中的某個位置上,當程序調用它是,指令就跳轉過來;當下一次程序調用它是,指令又跳轉過來;而內聯函數是程序中調用幾次內聯函數,內聯函數的代碼就會復制幾份放在對應的位置上
4)內聯函數一般在頭文件中定義,而一般函數在頭文件中聲明,在cpp中定義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM