C++中內(nèi)聯(lián)函數(shù)有什么用處,具體該怎么用
C++中內(nèi)聯(lián)函數(shù)有什么用處,具體該怎么用
內(nèi)聯(lián)函數(shù)必須是和函數(shù)體申明在一起,才有效。像這樣的申明Inline Tablefunction(int 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)該是用來定義存取函數(shù)。我們定義的類中一般會把數(shù)據(jù)成員定義成私有的或者保護(hù)的,這樣,外界就不能直接讀寫我們類成員的數(shù)據(jù)了。
對于私有或者保護(hù)成員的讀寫就必須使用成員接口函數(shù)來進(jìn)行。如果我們把這些讀寫成員函數(shù)定義成內(nèi)聯(lián)函數(shù)的話,將會獲得比較好的效率。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ù)體過大,一般的編譯器會放棄內(nèi)聯(lián)方式,而采用普通的方式調(diào)用函數(shù)。這樣,內(nèi)聯(lián)函數(shù)就和普通函數(shù)執(zhí)行效率一樣了。
內(nèi)聯(lián)函數(shù)怎么運(yùn)用?
定義內(nèi)聯(lián)函數(shù)的方法很簡單,只要在函數(shù)定義的頭前加上關(guān)鍵字inline即可。內(nèi)聯(lián)函數(shù)的定義方法與一般函數(shù)一… 然后再返回到調(diào)用它的函數(shù)中;而內(nèi)聯(lián)函數(shù)在調(diào)用時(shí),是將調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)體來替換。
請教內(nèi)聯(lián)函數(shù)的用法
內(nèi)聯(lián)函數(shù)通常是一種優(yōu)化措施,用于在調(diào)用點(diǎn)直接插入內(nèi)聯(lián)函數(shù)的body,這樣就可以節(jié)省函數(shù)調(diào)用的開銷(通常在函數(shù)入口需要幾條CPU指令在棧上保存寄存器,如EAX等,而在函數(shù)調(diào)用返回后,會從棧上彈出這些值)。對于一些比較小的函數(shù),比如只是返回一個(gè)值等,這類函數(shù),可以使用內(nèi)聯(lián)函數(shù)。
比如,inline int String::GetLength() const { return m_nLenght; }但是不是所有聲明為Inline的函數(shù)都會被內(nèi)聯(lián),這個(gè)需要由編譯器來決定,inline關(guān)鍵字只是一個(gè)Hint。
大量內(nèi)聯(lián)函數(shù)會導(dǎo)致代碼的bloat,從而導(dǎo)致執(zhí)行文件大小的增大。如果更改了內(nèi)百科聯(lián)函數(shù)的實(shí)現(xiàn),程序需要重新編譯,而不是像普通函數(shù)一樣,程序只需要重新鏈接即可??梢詤⒖肌禘xceptional C++》,好像有將Inline的,以前看過的。