程式設計珠璣 內聯函式和巨集

2021-08-26 21:47:21 字數 2138 閱讀 5982

一,內聯函式的用法

內聯函式從原始碼層層看,有函式的結構,而在編譯後,卻不具備函式的性質。編譯時,類似巨集替換,使用函式體替換呼叫處的函式名。一般在**中用inline修飾,但是能否形成內聯函式,需要看編譯器對該函式定義的具體處理。

inline tablefunction(int i) //是沒有效果的,編譯器只是把函式作為普通的函

數申明,我們必須定義函式體。

inline tablefunction(int i) ; //

這樣我們才算定義了乙個內聯函式。我們可以把它作為一般的函式一樣調

用。但是執行速度確比一般函式的執行速度要快。

內聯函式必須是和函式體申明在一起,才有效。

【注意】我們也可以將定義在類的外部的函式定義為內聯函式,比如:

class tableclass

;  inline int dec()

int getnum();

}inline int tableclass::getnum()

上面申明的三個函式都是內聯函式。在c++中,在類的內部

定義了函式體的函式,被預設為是內聯函式。而不管你是否有inline關鍵字。

二,內聯函式的應用(可以訪問物件的私有成員)

內聯函式在c++類中,應用最廣的,應該是用來定義訪問函式。我們定義的

類中一般會把資料成員定義成私有的或者保護的,這樣,外界就不能直接讀寫我

們類成員的資料了。

對於私有或者保護成員的讀寫就必須使用成員介面函式來進行。如果我們把

這些讀寫成員函式定義成內聯函式的話,將會獲得比較好的效率。

class sample

void settest(int i)

}

當然,內聯函式也有一定的侷限性。就是函式中的執行**不能太多了,如

果,內聯函式的函式體過大,一般的編譯器會放棄內聯方式,而採用普通的方式

呼叫函式。這樣,內聯函式就和普通函式執行效率一樣了。

三,內聯函式注意事項

1,在內聯函式內不允許用迴圈語句和開關語句。否則編譯將該函式視同普通函式

2,遞迴函式(自己呼叫自己的函式)是不能被用來做內聯函式的。

3,內聯函式只適合於只有1~5行的小函式。對乙個含有許多語句的大函式,函式呼叫和返回的開銷相對來說微不足道,所以也沒有必要用內聯函式實現。 

4,內聯函式的定義必須出現在內聯函式第一次被呼叫之前。 

5,類結構中所有在類說明內部定義的函式是內聯函式。

四,巨集的定義

帶引數的巨集定義和不帶引數的巨集定義。具體是指用乙個指定的標誌符來進行簡單的字串替換或者進行闡述替換。

巨集展開:在c程式編譯時將巨集名替換成字串的過程

#define max(a,b) ( (a)>(b) ) ? (a):(b)

五,巨集的侷限性

1,巨集不能訪問物件的私有成員。

2,巨集的定義很容易產生二意性。

二義性例子:

#define table_multi(x) (x*x)

table_multi(10) //

返回100,是正確的。

table_multi(10+10) //

我們期望的結果是400,而巨集的呼叫結果是(10+10*10+10),結果是120

這顯然不是我們要得到的結果。避免這些錯誤的方法,一是給巨集的引數都加上括號。

#define table_multi(x) ((x)*(x))

這樣可以確保不會出錯,但是,即使使用了這種定義,這個巨集依然有可能出錯

table_multi(a++) //我們本意是希望得到(a+1)*(a+1)的

結果,而巨集的展開結果: (a++)*(a++)

如果a的值是

4,我們得到的結果是4*4 = 16,a = 6。我們期望得到的是 5*5 = 25

六,內聯函式和巨集的區別

巨集是由預處理器對巨集進行替代,

內聯函式是

編譯器控制來實現的。

內聯函式是真正的函式,只是在需要用到的時

候,內聯函式像巨集一樣的展開,所以取消了函式的引數壓棧,減少了呼叫的開銷。

你可以象呼叫函式一樣來呼叫內聯函式,而不必擔心會產生於處理巨集的一

些問題。

內聯函式和巨集

1.內聯函式 在c 中我們通常定義以下函式來求兩個整數的最大值 複製 如下 int max int a,int b 為這麼乙個小的操作定義乙個函式的好處有 閱讀和理解函式 max 的呼叫,要比讀一條等價的條件表示式並解釋它的含義要容易得多 如果需要做任何修改,修改函式要比找出並修改每一處等價表示式容...

內聯函式和巨集

第一部分 巨集 為什麼要使用巨集呢?因為函式的呼叫必須要將程式執行的順序轉移到函式所存放在記憶體中的某個地 址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作要求在轉去執行前要儲存現場並記憶執行的位址,轉回後要恢復現場,並按原來 儲存位址繼續執行。因此,函式呼叫要有一定的時間...

內聯函式和巨集

內聯函式是為了提高程式執行速度的一種改進。當程式執行時,有時候需要重複呼叫乙個函式,但是因為重複呼叫這個函式,會不斷的造成函式呼叫,會不斷進棧出棧造成cpu的消耗。而內聯函式是在編譯時就將這個函式邊入進去,不用再進行位址的跳轉。但是不可避免的產生了一些 記憶體的消耗,所有有時候使用者在申請內聯時,內...