天天看點

内聯函數的了解

一、内聯函數的定義(來自百科)

内聯函數從源代碼層看,有函數的結構,而在編譯後,卻不具備函數的性質。内聯函數不是在調用時發生控制轉移,而是在編譯時将函數體嵌入在每一個調用處。編譯時,類似宏替換,使用函數體替換調用處的函數名。一般在代碼中用inline修飾,但是能否形成内斂函數,需要看編譯器對該函數定義的具體處理。

對于能否形成内聯函數,在C++ primer 中有說過 :内斂說明隻是向編譯器發出的一個請求,編譯器可以選擇忽略這個請求。

二、内聯函數的作用

根據内聯函數的定義來看,内聯函數是在編譯時類似宏替換,試用函數體替換調用處的函數名。那麼這樣做的目的是什麼?

内聯機制用于優化規模較小、流程直接、頻繁調用的函數。它的目的是為了消除函數調用時的時間開銷。

三、内聯函數的實作

C++有三種實作内斂函數的方式:

1、将函數的定義寫在類定義的内部;

2、在類定義内部的函數聲明上用inline顯式指定;

3、在類定義體外部的函數實作上用inline顯式指定;

接下來我們通過一個例子來說這三種方式:

#include<iostream>
using namespace std;
class Point
{
private:
    int x, y;
public:
    void print1()
    {
        cout << "inline 1" << endl;
    }
    inline void print2();
    void print3();
};
void Point::print2()
{
    cout << "inline 2" << endl;
}
inline void Point::print3()
{
    cout << "inline 3" << endl;
}
int main()
{
    Point a;
    a.print1();
    a.print2();
    a.print3();

    return 0;
}
           

這樣我們便實作了分别通過這三種形式構造了三種内聯函數,但是這裡大家要注意的inline并不是強制的,就像上面說的編譯器可以決定标有inline的函數不做inline,也就是編譯器可以忽略你的這個請求,inline 和 virtual是可以同時使用的,但是這時inline就沒什麼作用了。

四、注意事項

      最後我來總結一下inline的注意事項:

1、内聯函數類似宏替換的方式來實作,我們可以看出這其實是用空間換時間的一種做法,僅僅省去了函數調用的開銷,是以提高了函數執行效率。是以執行函數體内代碼的時間相比教育函數調用的時間開始較大的時候,我們不宜用内聯函數。

是以,再有if語句或switch語句或者遞歸語句時,我們通常不使用内聯函數。内聯函數隻适合于隻有1~5行的小函數。

2、内聯函數的定義必須出現在内聯函數第一次調用之前。

3、關鍵詞inline必須與函數定義體放在一起才能使函數成為内聯,僅将inline放在函數聲明前并沒有用。

例如:

inline void print();
void print()
{
      cout << "inline" << endl;
}
           

這樣是沒有用的。