c++從c中繼承的乙個重要特徵就是效率。假如c++的效率明顯低於c的效率,那麼就會有很大的一批程式設計師不去使用c++了。
在c中我們經常把一些短並且執行頻繁的計算寫成巨集,而不是函式,這樣做的理由是為了執行效率,巨集可以避免函式呼叫的開銷,這些都由預處理來完成。
但是在c++出現之後,使用預處理巨集會出現兩個問題:
1.第乙個在c中也會出現,巨集看起來像乙個函式呼叫,但是會有隱藏一些難以發現的錯誤。
2.第二個問題是c++特有的,預處理器不允許訪問類的成員,也就是說預處理器巨集不能用作類類的成員函式。
為了保持預處理巨集的效率又增加安全性,而且還能像一般成員函式那樣可以在類裡訪問自如,c++引入了內聯函式(inline function).
內聯函式為了繼承巨集函式的效率,沒有函式呼叫時開銷,然後又可以像普通函式那樣,可以進行引數,返回值型別的安全檢查,又可以作為成員函式。
預處理巨集的缺陷
預處理器巨集存在問題的關鍵是我們可能認為預處理器的行為和編譯器的行為是一樣的。當然也是由於巨集函式呼叫和函式呼叫在外表看起來是一樣的,因為也容易被混淆。但是其中也會有一些微妙的問題出現:
問題一:
#define add(x,y) x+yinlineint add(int x,int
y)void
test()
問題二:
#define compare(x,y) ((x) < (y) ? (x) : (y))int compare(int x,int
y)void
test02()
問題三:
預定義巨集函式沒有作用域概念,無法作為乙個類的成員函式,也就是說預定義巨集沒有辦法表示類的範圍。
內聯函式基本概念
在c++中,預定義巨集的概念是用內聯函式來實現的,而內聯函式本身也是乙個真正的函式。內聯函式具有普通函式的所有行為。唯一不同之處在於內聯函式會在適當的地方像預定義巨集一樣展開,所以不需要函式呼叫的開銷。因此應該不使用巨集,使用內聯函式
n 在普通函式(非成員函式)函式前面加上inline關鍵字使之成為內聯函式。但是必須注意必須函式體和宣告結合在一起,否則編譯器將它作為普通函式來對待。
inline void func(int a);
以上寫法沒有任何效果,僅僅是宣告函式,應該如下方式來做:
inline int func(int a)
注意: 編譯器將會檢查函式引數列表使用是否正確,並返回值(進行必要的轉換)。這些事預處理器無法完成的。
內聯函式的確占用空間,但是內聯函式相對於普通函式的優勢只是省去了函式呼叫時候的壓棧,跳轉,返回的開銷。我們可以理解為內聯函式是以空間換時間。
類內部的內聯函式
為了定義內聯函式,通常必須在函式定義前面放乙個inline關鍵字。但是在類內部定義內聯函式時並不是必須的。任何在類內部定義的函式自動成為內聯函式。
classperson
void printperson()
}
建構函式person,成員函式printperson在類的內部定義,自動成為內聯函式。
內聯函式和編譯器
內聯函式並不是何時何地都有效,為了理解內聯函式何時有效,應該要知道編譯器碰到內聯函式會怎麼處理?
對於任何型別的函式,編譯器會將函式型別(包括函式名字,引數型別,返回值型別)放入到符號表中。同樣,當編譯器看到內聯函式,並且對內聯函式體進行分析沒有發現錯誤時,也會將內聯函式放入符號表。
當呼叫乙個內聯函式的時候,編譯器首先確保傳入引數型別是正確匹配的,或者如果型別不正完全匹配,但是可以將其轉換為正確型別,並且返回值在目標表示式裡匹配正確型別,或者可以轉換為目標型別,內聯函式就會直接替換函式呼叫,這就消除了函式呼叫的開銷。假如內聯函式是成員函式,物件this指標也會被放入合適位置。
型別檢查和型別轉換、包括在合適位置放入物件this指標這些都是預處理器不能完成的。
但是c++內聯編譯會有一些限制,以下情況編譯器可能考慮不會將函式進行內聯編譯:
ü 不能存在任何形式的迴圈語句
ü 不能存在過多的條件判斷語句
ü 函式體不能過於龐大
ü 不能對函式進行取址操作
內聯僅僅只是給編譯器乙個建議,編譯器不一定會接受這種建議,如果你沒有將函式宣告為內聯函式,那麼編譯器也可能將此函式做內聯編譯。乙個好的編譯器將會內聯小的、簡單的函式。
C 內聯函式
1 什麼是內聯函式?內聯函式就是小型函式,犧牲空間來節省函式呼叫的開銷,一般用作比較小的函式,即函式內部沒有迴圈 開關語句等。內聯函式被發明出來就是為了取代c中的巨集,因為巨集是單純的替換而沒有型別檢查所以經常出毛病,2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率...
C 內聯函式
1 什麼是內聯函式?2 為什麼要引入內聯函式?3 為什麼inline能取代巨集?4 內聯函式和巨集的區別?5 什麼時候用內聯函式?6 如何使用內聯函式?7 內聯函式的優缺點?8 如何禁止函式進行內聯?9 注意事項 1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內...
c 內聯函式
1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內。2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率問題。另外,前面我們講到了巨集,裡面有這麼乙個例子 define abs x x 0?x x 當 i出現時,巨集就會歪曲我們的意思...