c 之內聯函式

2021-08-24 23:43:23 字數 1955 閱讀 6156

定義:

c++ 內聯函式是通常與類一起使用。如果乙個函式是內聯的,那麼在編譯時,編譯器會把該函式的**副本放置在每個呼叫該函式的地方。

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

如果想把乙個函式定義為內聯函式,則需要在函式名前面放置關鍵字 inline,在呼叫函式之前需要對函式進行定義。如果已定義的函式多於一行,編譯器會忽略 inline 限定符。

在類定義中的定義的函式都是內聯函式,即使沒有使用 inline 說明符。

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

使用原則:

在使用內聯函式時要留神:

1.在內聯函式內不允許使用迴圈語句和開關語句;

2.內聯函式的定義必須出現在內聯函式第一次呼叫之前;

3.類結構中所在的類說明內部定義的函式是內聯函式。

特性

① 類的成員函式預設為內聯函式

② 以空間換取時間,省去函式棧幀的開銷

③ inline必須函式定義放在一起,才能成為內聯函式,僅將inline放在宣告前是不起不作用的。

④ 內部**較短,編譯器會自動優化 當函式體內**很長或有遞迴時,內聯不會展開。

例如:

在debug模式下,對編譯器重新設定後:

inline

int add(int a,int b)

int main()

轉到反彙編:

可以看到 在上述函式前增加inline關鍵字將其改為內聯函式,在編譯期間編譯器會用函式體替換函式的呼叫。

內聯函式優缺點:

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

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

巨集的優缺點:

(1)、巨集只做簡單的字串替換,函式是引數傳遞,所以必然有引數型別檢查(支援各種型別,而不是只有字串)。

(2)、巨集不經計算而直接替換引數,函式呼叫則是將引數表示式求值再傳遞給形參。

(3)、巨集在編譯前進行,即先替換再編譯。而函式是編譯後,在執行時才呼叫的。巨集佔編譯時間,而函式佔執行時間。

(4)、巨集引數不佔空間,因為只做字串替換,而函式呼叫時引數傳遞是變數之間的傳遞,形參作為區域性變數佔記憶體空間。

(5)、函式呼叫需要保留現場,然後轉入呼叫函式執行,執行完畢再返回主調函式,這些耗費在巨集中是沒有的。

巨集與內聯函式的區別:

使用巨集和內聯函式都可以節省在函式呼叫方面的時間和空間開銷。二者都是為了提高效率,但是卻有著顯著的區別:

(1)、在使用時,巨集只做簡單的預處理器符號表(字串)中的簡單替換。而內聯函式可以進行引數型別檢查,且具有返回值(也能被強制轉換為可轉換的合適型別)。

(2)、內聯函式首先是函式,函式的許多性質都適用於內聯函式(如內聯函式可以過載)。

(3)、內聯函式可以作為某個類的成員函式,這樣可以使用類的保護成員和私有成員。而當乙個表示式涉及到類保護成員或私有成員時,巨集就不能實現了(無法將this指標放在合適位置)。

C 之內聯函式

一 目的 提高程式執行速度所做的一項改進。二 內聯函式與常規函式的區別 編譯過程的最終產品是程式 由一組機器語言指令組成。執行程式時作業系統將這些指令載入到計算機記憶體中,因此每條指令都有特有的記憶體位址。計算機隨後逐步執行這些命令。執行到函式呼叫指令時,程式將在函式呼叫後立即儲存該指令的記憶體位址...

C 之內聯函式

內聯函式是一種特殊的函式,具有普通函式的特徵 引數檢查,返回型別等 內聯函式是對編譯器的一種請求,因此編譯器可能拒絕這種請求 內聯函式由 編譯器處理,直接將編譯後的函式體插入呼叫的地方 巨集 片段 由預處理器處理,進行簡單的文字替換,沒有任何編譯過程 注 內聯函式宣告時inline關鍵字必須和函式定...

c 之內聯函式

若有不對,歡迎道友予以指正,提前謝過。內聯函式 定義時需要關鍵字inline。實際上是和巨集定義一般,在呼叫函式的地方,用函式體進行替換。inline需要在函式定義的時候加入才有效,在宣告的時候不需要 而類宣告中的成員函式自動成為內聯函式。tip 只有當函式只有 10 行甚至更少時才將其定義為內聯函...