內聯函數是代碼被插入到調用者代碼處的函數。如同?#define?宏,內聯函數通過避免被調用的開銷來提高執行效率,尤其是它能夠通過調用(“過程化集成”)被編譯器優化。?宏定義不檢查函數參數,返回值什么的,只是展開,相對來說,內聯函數會檢查參數類型,所以更安全。
內聯函數和宏很類似,而區別在于,宏是由預處理器對宏進行替代,而內聯函數是通過編譯器控制來實現的。而且內聯函數是真正的函數,只是在需要用到的時候,內聯函數像宏一樣的展開,所以取消了函數的參數壓棧,減少了調用的開銷。你可以象調用函數一樣來調用內聯函數,而不必擔心會產生于處理宏的一些問題。?
聲明內聯函數看上去和普通函數非常相似:?
? ? ? void?f(int?i,?char?c);?
?????
當你定義一個內聯函數時,在函數定義前加上?inline?關鍵字,并且將定義放入頭文件:?
? ? ? inline?
? ? ? void?f(int?i,?char?c)?
? ? ? {?
? ? ? //?...?
? ? ? }?
?????? ? ?
? ? ?任何在類的說明部分定義的函數都會被自動的認為是內聯函數。?
? ? ?內聯函數必須是和函數體申明在一起,才有效。像這樣的申明Inline?Tablefunction(int?I)是沒有效果的,編譯器只是把函數作為普通的函數申明,我們必須定義函數體。?
? ? ?Inline?tablefunction(int?I)?{return?I*I};?
?????
?????這樣我們才算定義了一個內聯函數。我們可以把它作為一般的函數一樣調用。但是執行速度確比一般函數的執行速度要快。?
? ? ?我們也可以將定義在類的外部的函數定義為內聯函數,比如:?
? ? ?Class?TableClass{?
???? Private:?
???? Int?I,j;?
???? Public:?
???? Int?add()?{?return?I+j;};?
???? Inline?int?dec()?{?return?I-j;}?
???? Int?GetNum();?
????}?
????inline?int?tableclass::GetNum(){?
????return?I;?
????}?
?????
? ? ?上面申明的三個函數都是內聯函數。在C++中,在類的內部定義了函數體的函數,被默認為是內聯函數。而不管你是否有inline關鍵字。?
? ? ?內聯函數在C++類中,應用最廣的,應該是用來定義存取函數。我們定義的類中一般會把數據成員定義成私有的或者保護的,這樣,外界就不能直接讀寫我們類成員的數據了。對于私有或者保護成員的讀寫就必須使用成員接口函數來進行。如果我們把這些讀寫成員函數定義成內聯函數的話,將會獲得比較好的效率。?
? ? ?Class?sample{?
???? Private:?
???? Int?nTest;?
???? Public:?
???? Int?readtest(){?return?nTest;}?
???? Void?settest(int?I)?{nTest=I;}?
? ? ?}?
?????
? ? ?當然,內聯函數也有一定的局限性。就是函數中的執行代碼不能太多了,如果,內聯函數的函數體過大,一般的編譯器會放棄內聯方式,而采用普通的方式調用函數。這樣,內聯函數就和普通函數執行效率一樣了。
轉載于:https://www.cnblogs.com/chengxuyuancc/archive/2013/04/04/2999844.html