內聯(lián)函數詳解
什么是內聯(lián)性和外聯(lián)函數
類(lèi)的成員函數可以分為內聯(lián)函數和外聯(lián)函數。內聯(lián)函數是指那些定義在類(lèi)體內的成員函數,即該函數的函數體放在類(lèi)體內。而說(shuō)明在類(lèi)體內,定義在類(lèi)體外的成員函數叫外聯(lián)函數。外聯(lián)函數的函數體在類(lèi)的實(shí)現部分。
內聯(lián)函數在調用時(shí)不是像一般的函數那樣要轉去執行被調用函數的函數體,執行完成后再轉回調用函數中,執行其后語(yǔ)句,而是在調用函數處用內聯(lián)函數體的代碼來(lái)替換,這樣將會(huì )節省調用開(kāi)銷(xiāo),提高運行速度。
內聯(lián)函數與前面講過(guò)的帶參數的宏定義進(jìn)行一下比較,它們的代碼效率是一樣的,但是內聯(lián)函數要優(yōu)于宏定義,因為內聯(lián)函數遵循函數的類(lèi)型和作用域規則,它與一般函數更相近,在一些編譯器中,一旦關(guān)上內聯(lián)擴展,將與一般函數一樣進(jìn)行調用,調試比較方便。
外聯(lián)函數變成內聯(lián)函數的方法很簡(jiǎn)單,只要在函數頭前面加上關(guān)鍵字inline就可以了。
#include iostream>
using namespace std;
class A
{
public:
A(int x, int y) //內聯(lián)函數
{
X=x;Y=y;
}
int a() //內聯(lián)函數
{
return X;
}
int b() //內聯(lián)函數
{
return Y;
}
int c();
int d();
private:
int X,Y;
};
//inline定義內聯(lián)函數
inline int A::c()
{
return a()+b();
}
inline int A::d()
{
return c();
}
void main()
{
A m(3,5);
int I=m.d();
coutd()return:Iendl;
}
輸出結果:
d()return:8
說(shuō)明:類(lèi)A中,直接定義了3個(gè)內聯(lián)函數,又使用inline定義了2個(gè)內聯(lián)函數。
引入內聯(lián)函數的意義
函數是一種更高級的抽象。它的引入使得編程者只關(guān)心函數的功能和使用方法,而不必關(guān)心函數功能的具體實(shí)現;函數的引入可以減少程序的目標代碼,實(shí)現程序代碼和數據的共享。但是,函數調用也會(huì )帶來(lái)降低效率的問(wèn)題,因為調用函數實(shí)際上將程序執行順序轉移到函數所存放在內存中某個(gè)地址,將函數的程序內容執行完后,再返回到轉去執行該函數前的地方。這種轉移操作要求在轉去前要保護現場(chǎng)并記憶執行的地址,轉回后先要恢復現場(chǎng),并按原來(lái)保存地址繼續執行。因此,函數調用要有一定的時(shí)間和空間方面的開(kāi)銷(xiāo),于是將影響其效率。特別是對于一些函數體代碼不是很大,但又頻繁地被調用的函數來(lái)講,解決其效率問(wèn)題更為重要。引入內聯(lián)函數實(shí)際上就是為了解決這一問(wèn)題。
在程序編譯時(shí),編譯器將程序中出現的內聯(lián)函數的調用表達式用內聯(lián)函數的函數體來(lái)進(jìn)行替換。顯然,這種做法不會(huì )產(chǎn)生轉去轉回的問(wèn)題,但是由于在編譯時(shí)將函數體中的代碼被替代到程序中,因此會(huì )增加目標程序代碼量,進(jìn)而增加空間開(kāi)銷(xiāo),而在時(shí)間代銷(xiāo)上不象函數調用時(shí)那么大,可見(jiàn)它是以目標代碼的增加為代價(jià)來(lái)?yè)Q取時(shí)間的節省。
在程序中,調用其函數時(shí),該函數在編譯時(shí)被替代,而不是像一般函數那樣是在運行時(shí)被調用。
使用內聯(lián)函數應注意的事項
內聯(lián)函數具有一般函數的特性,它與一般函數所不同之處只在于函數調用的處理。一般函數進(jìn)行調用時(shí),要將程序執行權轉到被調用函數中,然后再返回到調用它的函數中;而內聯(lián)函數在調用時(shí),是將調用表達式用內聯(lián)函數體來(lái)替換。在使用內聯(lián)函數時(shí),應注意如下幾點(diǎn):
1.在內聯(lián)函數內不允許用循環(huán)語(yǔ)句和開(kāi)關(guān)語(yǔ)句。
如果內聯(lián)函數有這些語(yǔ)句,則編譯將該函數視同普通函數那樣產(chǎn)生函數調用代碼,遞歸函數(自己調用自己的函數)是不能被用來(lái)做內聯(lián)函數的。內聯(lián)函數只適合于只有1~5行的小函數。對一個(gè)含有許多語(yǔ)句的大函數,函數調用和返回的開(kāi)銷(xiāo)相對來(lái)說(shuō)微不足道,所以也沒(méi)有必要用內聯(lián)函數實(shí)現。
2.內聯(lián)函數的定義必須出現在內聯(lián)函數第一次被調用之前。
3.本欄目講到的類(lèi)結構中所有在類(lèi)說(shuō)明內部定義的函數是內聯(lián)函數。
評論