c++內聯函數

函數調用過程

c++通過編譯生成可執行程序文件exe,存放在外存儲器中。程序啓動,系統從外存儲器中將可執行文件裝載到內存中,從入口地址(main函數起始處)開始執行。程序執行中遇到了對其餘函數的調用,就暫停當前函數的執行,並保存下一條指令的地址做爲從被調函數返回後繼續執行的入口點,保存現場。而後轉到被調函數的入口地址執行被調函數。遇到return語句或者被調函數結束後,恢復先前保存的現場,從先前保存的返回地址處繼續執行主調函數的其他部分。c++

內聯函數

函數調用須要進行現場保護,以便在函數調用以後繼續進行。函數調用後還須要恢復現場才能繼續執行。這都須要系統開銷,影響了程序的效率。
安全

內聯函數在編譯的時候將所調用的函數代碼直接嵌入到主調函數中,定義方式就是在普通的函數定義前面加上inline,不存在程序流程跳轉和返回,可是增長了程序代碼。內聯函數函數體不能含有複雜的結構控制語句,適用於1-5行的小函數。當函數規模比較大的時候,函數運行的時間相對與函數的調用和返回時間大不少,綜合時間和空間考慮,用內聯沒有太大意義。函數

原理:

對於任何內聯函數,編譯器在符號表裏放入函數的聲明(包括名字、參數類型、返回值類型)。若是編譯器沒有發現內聯函數存在錯誤,那麼該函數的代碼也被放入符號表裏。在調用一個內聯函數時,編譯器首先檢查調用是否正確(進行類型安全檢查,或者進行自動類型轉換,固然對全部的函數都同樣)。若是正確,內聯函數的代碼就會直接替換函數調用,因而省去了函數調用的開銷。spa

內聯函數與宏的區別

1.內聯函數在運行時可調試,而宏定義不能夠;調試

2.編譯器會對內聯函數的參數類型作安全檢查或自動類型轉換(同普通函數),而宏定義則不會; 內存

3.內聯函數能夠訪問類的成員變量,宏定義則不能; 編譯器

4.在類中聲明同時定義的成員函數,自動轉化爲內聯函數。編譯


C++ 語言的函數內聯機制既具有宏代碼的效率,又增長了安全性,並且能夠自由操做類的數據成員。因此在C++ 程序中,應該用內聯函數取代全部宏代碼效率

一個可執行文件的cpp文件中一個函數只能被定義一次。若是你把函數定義在一個.h文件中並讓兩個cpp包含就會形成這個函數分別在兩個cpp中被定義產生錯誤。可是inline函數是容許在多個cpp中屢次定義的,就解決了這個問題。變量

相關文章
相關標籤/搜索