頻道欄目
首頁 > 資訊 > C++ > 正文

C++之內聯函數inline的使用解析

18-07-30        來源:[db:作者]  
收藏   我要投稿

概念

內聯函數是指用inline關鍵字修飾的函數,在類內定義的函數被默認成內聯函數。

內聯函數從源代碼層看,有函數的結構,而在編譯后,卻不具備函數的性質。 內聯函數不是在調用時發生控制轉移,而是在編譯時將函數體嵌入在每一個調用處。編譯時,類似宏替換,使用函數體替換調用處的函數名。一般在代碼中用inline修飾,但是能否形成內聯函數,需要看編譯器對該函數定義的具體處理。 對內聯函數進行任何修改,都需要重新編譯函數的所有客戶端,因為編譯器需要重新更換一次所有的代碼,否則將會繼續使用舊的函數。 如果想把一個函數定義為內聯函數,則需要在函數名前面放置關鍵字inline,在調用函數之前需要對函數進行定義。如果已定義的函數多于一行,編譯器會忽略 inline 限定符。 在類定義中的定義的函數都是內聯函數,即使沒有使用inline說明符。

下面是一個實例,使用內聯函數來返回兩個數中的最大值:

#include 

using 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

#include 
using 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關鍵字。

相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

免费的黄色网站