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