內聯函數是指用inline關鍵字修飾的函數,在類內定義的函數被默認成內聯函數。
內聯函數從源代碼層看,有函數的結構,而在編譯后,卻不具備函數的性質。 內聯函數不是在調用時發生控制轉移,而是在編譯時將函數體嵌入在每一個調用處。編譯時,類似宏替換,使用函數體替換調用處的函數名。一般在代碼中用inline修飾,但是能否形成內聯函數,需要看編譯器對該函數定義的具體處理。 對內聯函數進行任何修改,都需要重新編譯函數的所有客戶端,因為編譯器需要重新更換一次所有的代碼,否則將會繼續使用舊的函數。 如果想把一個函數定義為內聯函數,則需要在函數名前面放置關鍵字inline,在調用函數之前需要對函數進行定義。如果已定義的函數多于一行,編譯器會忽略 inline 限定符。 在類定義中的定義的函數都是內聯函數,即使沒有使用inline說明符。
下面是一個實例,使用內聯函數來返回兩個數中的最大值:
#includeusing namespace std; class One { private: int age; double len; inline int max(int x, int y) { return (x > y) x : y; } }; inline int min(int x, int y) { return (x < y) x : y; } int main() { cout << "Max(5, 6):" << max(5, 6) << endl; cout << "Min(5, 6):" << min(5, 6) << endl; return 0; }
結果:
Max(5, 6):6
Min(5, 6):5
Process finished with exit code 0
引入內斂函數的目的:提高函數調用的效率。
內聯函數特點:
函數體代碼量應該較少,一般都是小函數,最好控制在10行以內; 內聯函數不允許使用循環語句和開關語句; 內聯函數的定義必須出現內聯函數第一次調用之前; 在類結構中定義的函數就是類聯函數。
內斂函數運行機制:當函數被聲明為內斂函數以后,編譯器會將內斂函數展開,不是按照通常函數調用機制進行調用。
內聯函數的優缺點:
優點:函數體積小,代碼運行高效。
缺點:濫用內聯函數不易控制內存,很容易導致內存增加,這是典型的以空間換時間的函數。
inline函數放在頭文件
關鍵字inline必須與函數定義體放在一起才能使函數成為內聯,僅僅只是將inline放在函數聲明前面沒有任何實際作用。
下面函數不能成為內聯函數:
inline void test(); void test() { cout << "useless function!" << endl; }
下面函數為內斂函數:
void test(); inline void test() { cout << "useless function!" << endl; }
內斂函數是一種用于“實現”的關鍵字,而不是用來“聲明”的關鍵字。雖然inline函數可以出現在函數聲明里面,加上部分書籍存在內聯函數聲明,但是為了規范inline關鍵字,請遵照C++函數實現的代碼規范(雖然這不會影響函數功能)。請各位大佬認真注意這些細節!
我們也可以單獨定義頭文件,將內聯函數放在其中,這樣既能保證每次調用的函數都是相同的,也可以保證在調用點能夠找到函數定義從而方便完成函數內聯替換。如:
InlineFunc.h
#includeusing namespace std; #ifndef INLINEFUNCTION_INLINEFUNC_H #define INLINEFUNCTION_INLINEFUNC_H #endif //INLINEFUNCTION_INLINEFUNC_H inline double square(double n) { return n * n; } inline void printSomething(){ cout << "This is inline function!" << endl; }
main.cpp
#include#include "InlineFunc.h" using namespace std; int main() { printSomething(); cout << "this number's square is " << square(5.0) << endl; return 0; }
結果:
This is inline function!
this number's square is 25
Process finished with exit code 0
一、內聯函數和宏定義的區別?
參考答案:
1. 內聯函數運行時可以調試,而宏定義不可以。
2. 編譯器會對內聯函數的參數類型做安全檢查或自動類型轉化,宏定義不會。
3. 內聯函數可以訪問類的成員變量,宏定義不能。
4. 在類中聲名同時定義的成員函數,自動轉化為內聯函數。
5. 內聯函數將代碼直接插入調用處,減少普通函數調用資源,宏是在代碼調用處不加任何驗證的簡單替換。
6. 內聯函數是函數,宏不是函數。
二、內聯函數在與類的作用關系?
在類中定義函數直接為內聯函數,如果只是聲明函數則可以不用(強迫癥的我受不了,必須不用。﹥嚷摵瘮。要是在類外需要聲明內聯函數必須加上inline關鍵字。