inline 內聯函式詳解

2021-08-15 17:57:37 字數 2377 閱讀 6788

一、inline 

關鍵字用來定義乙個類的

內聯函式,引入它的主要原因是用它替代c中

表示式形式的

巨集定義。

表示式形式的

巨集定義一例:

#define expressionname(var1,var2) ((var1)+(var2))*((var1)-(var2))為什麼要取代這種形式呢,且聽我道來:

1. 首先談一下在c中使用這種形式

巨集定義的原因,c語言是乙個效率很高的語言,這種

巨集定義在形式及使用上像乙個函式,但它使用

預處理器實現,沒有了引數壓棧,**生成等一系列的操作,因此,效率很高,這是它在c中被使用的乙個主要原因。

2. 這種

巨集定義在形式上類似於乙個函式,但在使用它時,僅僅只是做

預處理器

符號表中的簡單替換,因此它不能進行引數有效性的檢測,也就不能享受c++

編譯器嚴格型別檢查的好處,另外它的返回值也不能被強制轉換為可轉換的合適的型別,這樣,它的使用就存在著一系列的隱患和侷限性。

3. 在c++中引入了類及類的訪問控制,這樣,如果乙個操作或者說乙個

表示式涉及到類的保護成員或私有成員,你就不可能使用這種

巨集定義來實現(因為無法將this

指標放在合適的位置)。

4. inline 推出的目的,也正是為了取代這種表示式形式的

巨集定義,它消除了它的缺點,同時又很好地繼承了它的優點。

對應於上面的1-3點,闡述如下:

1. inline 定義的類的

內聯函式,函式的**被放入

符號表中,在使用時直接進行替換,(像巨集一樣展開),沒有了呼叫的開銷,效率也很高。

2. 很明顯,類的

內聯函式也是乙個真正的函式,

編譯器在呼叫乙個內聯函式時,會首先檢查它的引數的型別,保證呼叫正確。然後進行一系列的相關檢查,就像對待任何乙個真正的函式一樣。這樣就消除了它的隱患和侷限性。

3. inline 可以作為某個

類的成員函式,當然就可以在其中使用所在類的保護成員及私有成員。

在何時使用inline函式:

首先,你可以使用inline函式完全取代

表示式形式的巨集定義。

另外要注意,

內聯函式一般只會用在函式內容非常簡單的時候,這是因為,內聯函式的**會在任何呼叫它的地方展開,如果函式太複雜,**膨脹帶來的惡果很可能會大於效率的提高帶來的益處。

內聯函式最重要的使用地方是用於類的訪問函式。

簡單提一下inline 的使用吧:

1.在類中定義這種函式:

class classname; // 如果在類中直接定義,不需要用inline修飾,

編譯器自動化為

內聯函式

.... //此說法在《c++ primer》中提及

.... }

2.在類外定義前加inline

關鍵字:

class account //與1相同

double getbalance(); //在類中宣告

double deposit( double amount );

double withdraw( double amount );

private:

double balance; };

inline double account::getbalance() //在類外定義時新增inline

關鍵字inline double account::deposit( double amount )

inline double account::withdraw( double amount )

此外還有一些規則需注意:

1、inline說明對

編譯器來說只是一種建議,編譯器可以選擇忽略這個建議。比如,你將乙個長達1000多行的函式指定為inline,

編譯器就會忽略這個inline,將這個函式還原成普通函式。

2、在呼叫

內聯函式時,要保證內聯函式的定義讓編譯器"看"到,也就是說內聯函式的定義要在標頭檔案中,這與通常的函式定義不一樣。但如果你習慣將函式定義放在cpp檔案中,或者想讓標頭檔案更簡潔一點,可這樣做:

中#ifndef someinline_h

#define someinline_h

inline type example(void);

//........其他函式的宣告

#include「someinlie.cpp」 //原始檔字尾名隨

編譯器而定

#endif

中#include"someinline.h"

type example(void)

//...............其他函式的定義

以上方法是通用、有效的,可放心使用,不必擔心在標頭檔案包含cpp檔案會導致編譯錯誤

inline內聯函式詳解

內聯函式 tip 只有當函式只有 10 行甚至更少時才將其定義為內聯函式.定義 當函式被宣告為內聯函式之後,編譯器會將其內聯展開,而不是按通常的函式呼叫機制進行呼叫.優點 當函式體比較小的時候,內聯該函式可以令目標 更加高效.對於訪問函式以及其它函式體比較短,效能關鍵的函式,鼓勵使用內聯.缺點 濫用...

C 內聯函式(inline)詳解

內聯函式 函式呼叫是有時間和空間開銷的。程式在執行乙個函式之前需要做一些準備工作,要將實參 區域性變數 返回位址以及若干暫存器都壓入棧中,然後才能執行函式體中的 在函式體中的 執行完畢後還要恢復現場,將之前壓入棧中的資料都出棧,才能接著執行函式呼叫位置以後的 內聯函式是c 為提高程式執行速度所做的一...

iOS OC內聯函式 inline的詳解

在ios中的一些框架中,static inline是經常出現的關鍵字組合.static inline cgfloat cgfloatfrompixel cgfloat value yyscreenscale 方法說明 cgfloat yyscreenscale return scale 雖然stat...