C++的inline

在C語言中,宏函數常常被用來優化代碼以下降函數調用的開銷;而在C++中,一般更建議使用inline關鍵字而不是宏函數來實現相同的做用。函數

什麼是inline function

inline function中文翻譯叫內聯函數,即便用inline關鍵字來告訴編譯器能夠在代碼中展開函數實現,編譯器會在編譯期使用函數定義來替換函數的調用。優化

inline函數的使用方法

inline函數的使用方法很是簡單,在函數定義的前面加上inline修飾便可。翻譯

例如:debug

class Foo
{
    public:
        inline int bar(int a, int b);
}
int Foo::bar(int a, int b)
{
    return a + b;
}

爲何要使用inline呢?

inline函數主要用來使一些實現比較簡單、調用頻繁的函數內聯化,以下降這些函數調用的開銷。
inline函數主要有如下這些優勢:code

  1. 避免函數調用開銷;對象

  2. 節省了函數參數入棧出棧的開銷;遞歸

  3. 節省了函數返回值的開銷;編譯器

固然inline函數也有一些缺點:io

  1. 會使代碼膨脹,增長的可執行文件的體積;編譯

  2. inline函數改變後會讓全部使用該函數的代碼須要從新編譯;

  3. 可能使頭文件更加臃腫(inline函數常常實如今頭文件裏);

  4. 可能致使潛在更多的分頁錯誤;

使用inline的注意點

  1. inline關鍵字只是一個給編譯器的建議,而並非強制內聯。編譯器會本身決定要不要內聯。標了inline的編譯器也不必定會內聯,沒有標inline的編譯器也可能會內聯;

  2. 與宏相比,inline對debug更加友好;

  3. 全部直接在class聲明的時候直接給出定義的函數都是默認inline的,無論有沒有inline關鍵字;

  4. 虛函數一般不該該是inline的;可是在某些狀況下,例如在同一個函數體中聲明並構建一個對象,這樣的狀況下編譯器很是明確對象的類型,虛函數也是能夠被inline的;

  5. 模板類的方法雖然都是在頭文件中給出實現的,但不老是inline函數;

  6. 大多數編譯器會針對遞歸函數作inline處,並能夠控制inline的深度。例如msvc的-inline_recursion(on)或者gcc的--max-inline-insns-recursive;

  7. 若是inline函數被多處引用,必定要定義在頭文件中,不然編譯器在展開函數時沒法找到函數的定義就會報link錯誤;

相關文章
相關標籤/搜索