內聯函式從源**層看,有函式的結構,而在編譯後,卻不具備函式的性質。編譯時,類似巨集替換,使用函式體替換呼叫處的函式名。一般在**中用inline修飾,但是能否形成內聯函式,需要看編譯器對該函式定義的具體處理。如果,內聯函式的函式體過大,一般的編譯器會放棄內聯方式,而採用普通的方式呼叫函式。
任何在類的說明部分定義的函式都會被自動的認為是內聯函式,可以在程式中使用 #pragma auto_inline禁用內聯。
優點:內聯擴充套件是用來消除函式呼叫時的時間開銷。
注意:l 遞迴函式不能內聯;
l 內聯函式只適合於只有1~5行的小函式;
l 在內聯函式內不允許用迴圈語句和開關語句。【編譯器不一定報錯,已測,比如後面的**測試就通過了】
內聯與巨集定義區別:
l 巨集是由預處理器對巨集進行替代,而內聯函式是通過編譯器控制來實現的;
l 內聯函式是真正的函式,只是在需要用到的時候,內聯函式像巨集一樣的展開,所以取消了函式的引數壓棧,減少了呼叫的開銷。你可以象呼叫函式一樣來呼叫內聯函式,而不必擔心會產生於處理巨集的一些問題。內聯函式與帶引數的巨集定義進行下比較,它們的**效率是一樣,但是內聯歡函式要優於巨集定義,因為內聯函式遵循的型別和作用域規則,它與一般函式更相近,在一些編譯器中,一旦關上內聯擴充套件,將與一般函式一樣進行呼叫,比較方便。
巨集的缺點:
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))
1 #include "stdio.h"
2 #include "stdlib.h"
3 4 #define fun(a) (a)*(a)
5 6 int64_t fun(int64_t num)
10 inline int64_t fun_in(int64_t num)
16 return a;
17 }
18 19 int main()
結果:
a=16,[6]
a=16 by fun,[5]
a=16 by fun,[4]
a=16 by fun_in,[5]
內聯函式和巨集定義
在c中,我們常用巨集定義來達到優化速度的目的,但由於巨集定義的種種缺陷 大家應該都吃過這種苦吧 在c 中引入了內聯函式。內聯函式實現了巨集的概念,任何在類內定義的函式會自動的成為內聯函式,但是也可以在類外用inline關鍵字來定義內聯函式。內聯的目的和巨集一樣是為了減少函式呼叫的開銷,但是通常我們會...
內聯函式與巨集定義
用內聯取代巨集 1.內聯可除錯 2.可進行型別安全檢查或自動型別轉換 3.可訪問成員變數。另外,定義在類宣告中的成員函式自動轉化為內聯函式。內聯函式與巨集定義 在c中,常用預處理語句 define來代替乙個函式定義。例如 define max a,b a b a b 該語句使得程式中每個出現max ...
巨集定義和內聯函式
巨集定義和內聯函式,都可以減少函式的呼叫開銷,每次呼叫函式不必壓棧和開闢新的空間。使用巨集定義和內聯函式 的執行效率高。它們的區別是 1 巨集定義是預編譯器載入,而內聯函式是由編譯器載入 2 巨集定義容易產生一些錯誤,define min x x x min 1 3 得到的結果不是我們想要的16,而...