內聯(lián)函數與普通函數的區別是什么
編號: QA004800
建立日期: 2003年12月21日 最后修改日期: 2003年12月21日
所屬類(lèi)別:
C/C++ - 其他方面 操作系統: WINDOWS
編程工具: VC++
問(wèn)題: 內聯(lián)函數與普通函數的區別是什么?
水平: 一無(wú)所知(劉建勛)
內聯(lián)函數是代碼被插入到調用者代碼處的函數。如同 #define 宏,內聯(lián)函數通過(guò)避免被調用的開(kāi)銷(xiāo)來(lái)提高執行效率,尤其是它能夠通過(guò)調用(“過(guò)程化集成”)被編譯器優(yōu)化。
內聯(lián)函數和宏很類(lèi)似,而區別在于,宏是由預處理器對宏進(jìn)行替代,而內聯(lián)函數是通過(guò)編譯器控制來(lái)實(shí)現的。而且內聯(lián)函數是真正的函數,只是在需要用到的時(shí)候,內聯(lián)函數像宏一樣的展開(kāi),所以取消了函數的參數壓棧,減少了調用的開(kāi)銷(xiāo)。你可以象調用函數一樣來(lái)調用內聯(lián)函數,而不必擔心會(huì )產(chǎn)生于處理宏的一些問(wèn)題。
聲明內聯(lián)函數看上去和普通函數非常相似:
void f(int i, char c);
當你定義一個(gè)內聯(lián)函數時(shí),在函數定義前加上 inline 關(guān)鍵字,并且將定義放入頭文件:
inline
void f(int i, char c)
{
// ...
}
任何在類(lèi)的說(shuō)明部分定義的函數都會(huì )被自動(dòng)的認為是內聯(lián)函數。
內聯(lián)函數必須是和函數體申明在一起,才有效。像這樣的申明Inline Tablefunction(int I)是沒(méi)有效果的,編譯器只是把函數作為普通的函數申明,我們必須定義函數體。
Inline tablefunction(int I) {return I*I};
這樣我們才算定義了一個(gè)內聯(lián)函數。我們可以把它作為一般的函數一樣調用。但是執行速度確比一般函數的執行速度要快。
我們也可以將定義在類(lèi)的外部的函數定義為內聯(lián)函數,比如:
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;
}
上面申明的三個(gè)函數都是內聯(lián)函數。在C++中,在類(lèi)的內部定義了函數體的函數,被默認為是內聯(lián)函數。而不管你是否有inline關(guān)鍵字。
內聯(lián)函數在C++類(lèi)中,應用最廣的,應該是用來(lái)定義存取函數。我們定義的類(lèi)中一般會(huì )把數據成員定義成私有的或者保護的,這樣,外界就不能直接讀寫(xiě)我們類(lèi)成員的數據了。對于私有或者保護成員的讀寫(xiě)就必須使用成員接口函數來(lái)進(jìn)行。如果我們把這些讀寫(xiě)成員函數定義成內聯(lián)函數的話(huà),將會(huì )獲得比較好的效率。
Class sample{
Private:
Int nTest;
Public:
Int readtest(){ return nTest;}
Void settest(int I) {nTest=I;}
}
當然,內聯(lián)函數也有一定的局限性。就是函數中的執行代碼不能太多了,如果,內聯(lián)函數的函數體過(guò)大,一般的編譯器會(huì )放棄內聯(lián)方式,而采用普通的方式調用函數。這樣,內聯(lián)函數就和普通函數執行效率一樣了。