天天看點

#yyds幹貨盤點#一文搞懂内聯函數!

🎈 作者:Linux猿​

🎈 簡介:CSDN部落格專家🏆,C/C++、面試、刷題、算法盡管咨詢我,關注我,有問題私聊!

内聯函數想必大家都很熟悉,适當的使用内聯函數可以提高程式的執行效率。本篇文章就來講解下内聯函數,趕緊來看下吧!

一、什麼是内聯函數?

内聯函數是在 C++ 中增加的一個功能,可以提高程式執行效率。如果函數是内聯的,編譯器在編譯時,會把内聯函數的實作替換到每個調用内聯函數的地方,可以與宏函數作類比,但宏函數不會進行類型檢查。

可以将普通函數或者類的成員函數聲明為内聯。

内聯函數一般要求如下:

1. 函數簡短,通常3-5行;

2. 函數内沒有複雜的實作,比如:包含while、for 循環,遞歸等;

3. 通常在多處有調用;

注意:函數聲明為内聯,僅僅是對編譯器的建議,如果函數比較複雜,編譯器會将其看做普通函數。

來看一個簡單的例子,如下所示:

#include <iostream>
 
using namespace std;
 
inline int Add(int x, int y) {
   return x + y;
}
 
int main() {
 
    cout<<"5 + 8 = "<<Add(5, 8)<<endl;
    cout<<"10 + 20 = "<<Add(10, 20)<<endl;
    return 0;
}      

輸出結果為:

linuxy@linuxy:~/inlineFunction$ ./main 
5 + 8 = 13
10 + 20 = 30
linuxy@linuxy:~/inlineFunction$      

在代碼執行的時候是這樣的:

int main() {
 
    cout<<"5 + 8 = "<<5 + 8<<endl;
    cout<<"10 + 20 = "<<10 + 20<<endl;
    return 0;
}      

内聯函數在調用處展開了。

再來看一個類的内聯函數,如下所示:

#include <iostream>
using namespace std;
 
class Node {
public:
    int Add(int x, int y);
};
 
inline int Add(int x, int y) {
   return x + y;
}
 
int main() {
 
    return 0;
}      

注意:定義在類中的函數,預設情況下都是内聯的,比如下面這種情況。

#include <iostream>
using namespace std;
 
class Node {
public:
    int Add(int x, int y) {//預設是内聯函數
        return x + y;
    }
};
 
int main() {
 
    return 0;
}      

但是,如果函數很複雜,編譯器會将其作為普通函數來處理。

二、為什麼要使用内聯函數 ?

引入内聯函數主要是解決一些頻繁調用的小函數消耗大量空間的問題。

通常情況下,在調用函數時,程式會将控制權從調用程式處轉移到被調用函數處,在這個過程中,傳遞參數、寄存器操作、傳回值等會消耗額外的時間和記憶體,如果調用的函數代碼量很少,也許轉移到調用函數的時間比函數執行的時間更長。而如果使用内聯函數,内聯函數會在調用處将代碼展開,進而節省了調用函數的開銷。

三、哪些函數不能是内聯函數?

1. 遞歸調用本身的函數;

2. 包含複雜語句的函數,例如:for、while、switch 等;

3. 函數包含靜态變量;

四、使用内聯函數的缺點

1. 如果使用很多内聯函數,生成的二進制檔案會變大;

2. 編譯的時間會增加,因為每次内聯函數有修改,就需要重新編譯代碼。

是以,并不是所有函數都要聲明為内聯函數,需要視具體情況而定。

五、總結

繼續閱讀