天天看點

了解C++關鍵字(8)---inline内聯函數

前面在總結const關鍵字時,曾提到:C++中幾乎抛棄了宏定義,進而接受了const。對于在c語言中的宏定義關鍵字“#define”,确實存在着很多優勢,并且在程式運作時充當了“替換”的工作。

我們知道,“#define”關鍵字,可以宏定義變量,也可以定義函數宏。比如

#define MAX(A,B) A>B?A:B

。在C++中,也提供了一個類似于函數宏的關鍵字“inline”。當然,它比“#define”的功能強得多,不然也不會出現。

下面詳細介紹inline關鍵字。

1、inline的特點

首先,我們要明确,inline隻是程式員(我們)向編譯器提供的一個請求,而不是一個指令。是以,函數雖然在定義的時候有“inline”,但編譯器并不一定以内聯的方式處理該函數。什麼情況下,會出現上述情形呢?我們先來看看inline的工作方式。

當我們定義一個普通函數,并在某處調用該函數時,該過程會經過保護函數入口位址、執行函數、傳回等過程。而在執行一條順序語句時,是沒有保護入口位址和傳回等操作的。若能向#define那樣完成替換操作,又能保持函數的功能,那該多好!inline實作了!

inline在工作時,将函數體以内聯的方式嵌入到調用處。比如:

#include<iostream>
using namespace std;
inline int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int m1=,m2=;
    cout<<max(m1,m2)<<endl;   //**等同于:cout<<(m1>m2?m1:m2)<<endl;**
    int n1=,n2=;
    cout<<max(n1,n2)<<endl;   //**等同于:cout<<(n1>n2?n1:n2)<<endl;**
}
           

由以上可見,inline是以空間擷取時間的。

那麼,若函數體過于龐大,或函數體中有循環、遞歸等語句時,若在多處調用inline函數,就會使得程式占用記憶體增大,得不償失。Google C++中明确指出,隻有函數中語句行數小于10行時才能夠使用inline。

2、内聯函數的定義方式

一般内聯函數有兩種定義方式:

  1. 隐式定義:在類定義内部定義的成員函數(包括友元函數,但不包括構造函數和析構函數)自動成為内聯函數,但在編譯時是不是以内聯方式進行,還要看編譯器的“心情”。為什麼不包括構造函數和析構函數呢?因為這兩個函數經常“偷偷”的幹許多我們不可見的事情,比如(可能存在類的繼承、許多成員變量的初始化等)。
  2. 顯示定義:即在函數定義(聲明時不算,而且最好不加)時,在前面加上“inline”關鍵字。

綜上,inline雖好,但并不完全是我們完全說了算,需要遵循編譯器的想法。

繼續閱讀