C 中實際專案開發中的內聯函式

2021-09-25 02:52:33 字數 1851 閱讀 4858

引入內聯函式的目的是為了解決程式中函式呼叫的效率問題,程式在編譯器編譯的時候,編譯器將程式**現的內聯函式的呼叫表示式用內聯函式的函式體進行替換,而對於其他的函式,都是在執行時候才被替代。其實就是用空間的代價去節省時間。

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

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

所以內聯函式一般都是1-5行的小函式,甚至更少。在實際的專案開發的過程中,通常禁止將最終不會被編譯器成功內聯的函式定義為內聯。因為一旦函式被定義為內聯函式,無論該函式最終是否會被成功的內聯展開,所有使用了該函式的原始檔經過編譯後都會有乙份該函式的例項,接著再由鏈結器將這其中冗餘的資料整理刪除,這個開銷是非常大的,會大大延長程式build的時間。

滿足以下任一條件的函式都禁止定義為內聯函式:

函式語句超過5行

含有迴圈語句

含有swith語句

不止一次出現if語句或條件運算子

特殊的函式:例如遞迴函式、多型中的虛函式等

針對上述第五點中的虛函式:如果類中定義了乙個內聯虛函式,那麼僅當編譯器在編譯階段確切知道是這個類的物件在呼叫這個內聯虛函式時,才會將該函式內聯展開(假設該函式的開銷允許它成功內聯)。除此以外,通過諸如指標、引用等方式呼叫該虛函式,編譯器在編譯階段時無法知道執行時實際執行的**是什麼,因此絕對不會將該函式內聯展開。但在實際的多型開發的環境中,基本都是通過指標、引用之類的方式來呼叫虛函式。所以,類中定義的內聯虛函式就犯了

「最終不會被編譯器成功內聯的函式定義為內聯」的錯誤,因此最好不要將虛函式定義為內聯函式。

inline是實現關鍵字,不是宣告關鍵字,用在函式宣告時是無效的。根據c++編譯器的特性,內聯函式是無法跨原始檔的,被多個原始檔使用的內聯函式只能同時將宣告和定義寫在同乙個標頭檔案中。如果內聯函式的宣告和定義分離在不同的檔案中,則只有在實現了內聯函式的原始檔中可以正常使用該內聯函式,其它原始檔中若呼叫了該內聯函式,在鏈結階段會報鏈結錯誤,或是由編譯器提供乙個非內聯版本的函式供其它原始檔使用,不會真正的展開。 此外,在類內就已經定義完成的函式,即使沒有加inline關鍵字,編譯器也會將其隱式定義為內聯函式,編譯時同一般的內聯函式相同處理。

在常見的

c++編譯器中,如果編碼者沒有為某個類提供構造/析構函式,編譯器會預設以內聯的方式生成這些函式。為沒有手動實現構造/析構函式的類實現乙個空的、非內聯的構造/析構函式,在一定程度上也會減少程式build的時間。

_forceinline指令:

在vc++中可使用另一關鍵字_forceinline 代替inline 關鍵字。這個關鍵字將命令編譯器跳過一般的roi 分析(return on investment –一種程式設計縮略語),將所對應的**強行內聯。有些時候編譯器會拒絕將乙個函式內聯,使用這個關鍵字,使用者只得到乙個編譯警告,就可強行進行內聯。

但是在實際開發的過程中,從編譯和**膨脹的角度來看,

__forceinline

是乙個非常危險的指令,它修改了編譯器對內聯函式處理上的預設行為。無論某個函式在開銷上是否適合內聯,該指令都會命令編譯器對這個函式進行強制內聯,__forceinline將最終是否成功內聯的決定權從編譯器轉交到了使用者手上,且該指令不具備可移植性,因此最好不要使用__forceinline指令。

C 中的內聯函式

華清遠見嵌入式學院 講師。c 中存在一些具有特殊意義或功能的特殊函式,我們來簡單介紹一下內聯函式。從軟體工程的角度來看,我們通常將乙個程式通過一組函式來進行實現,但是函式的呼叫涉及到執行時間的開銷,如果有的函式需要頻繁使用,則累計占用的時間會很長,所以c 提供了內聯函式的機制來提高效率,也就是在編譯...

C 中的內聯函式

c 中的內聯函式 華清遠見嵌入式學院講師。c 中存在一些具有特殊意義或功能的特殊函式,我們來簡單介紹一下內聯函式。從軟體工程的角度來看,我們通常將乙個程式通過一組函式來進行實現,但是函式的呼叫涉及到執行時間的開銷,如果有的函式需要頻繁使用,則累計占用的時間會很長,所以c 提供了內聯函式的機制來提高效...

C 中的內聯函式

本文主要和大家一起來學習一下c 中的內聯函式,旨在能夠更深層次的了解和掌握c 相關用法,力爭做到知其然還要知其所以然。關於內聯函式,本文主要從以下幾個方面進行了整理和歸納。一 相關描述 1 內聯函式主要目的是為了提高函式的執行效率,用關鍵字inline放在函式定義的前面即可,將函式指定為內聯函式。2...