05-內聯函數

寫在前面

接下來又要學一個關鍵字了--inline
使用inline修飾函數的聲明或者實現,可以使其變成內聯函數
建議聲明和實現都增加inline修飾

名詞解釋

特點:
編譯器會將函數調用直接展開爲函數體代碼 
可以減少函數調用的開銷 
會增大代碼體積
內聯函數和普通函數的區別在於:當編譯器處理調用內聯函數的語句時,
不會將該語句編譯成函數調用的指令,而是直接將整個函數體的代碼插人調用語句處,(這尼瑪又逼着我學彙編,還好大學時學過😏)
就像整個函數體在調用處被重寫了一遍一樣

碼上封口

將main.m 改爲mian.mm 文件
#include <iostream>
using namespace std;

//聲明內聯函數
inline int sum(int a, int b);

int main() {
    
    cout << "sum的和是:"<< sum(10, 20) << endl;
}

//內聯函數的實現
inline int sum(int a, int b) {
    return a + b;
}

碼來補充

◼ 內聯函數和宏,都可以減少函數調用的開銷 
◼ 對比宏,內聯函數多了語法檢測和函數特性
◼ 思考以下代碼的區別 #define sum(x) (x + x)
inline int sum(int x) { return x + x; } 
int a = 10; sum(a++);

裝逼一下

函數調用在執行時,首先要在棧中爲形參和局部變量分配存儲空間,然後還要將實參的值複製給形參,
接下來還要將函數的返回地址(該地址指明瞭函數執行結束後,程序應該回到哪裏繼續執行)放入棧中,
最後才跳轉到函數內部執行。這個過程是要耗費時間的。

另外,函數執行 return 語句返回時,需要從棧中回收形參和局部變量佔用的存儲空間
,然後從棧中取出返回地址,再跳轉到該地址繼續執行,這個過程也要耗費時間。


一般情況下,這個開銷可以忽略不計。但是,如果一個函數內部沒有幾條語句,執行時間本來就非常短,
那麼這個函數調用產生的額外開銷和函數本身執行的時間相比,就顯得不能忽略了。假如這樣的函數在一個循環中被上千萬次地執行,
函數調用導致的時間開銷可能就會使得程序運行明顯變慢。

作爲特別注重程序執行效率,適合編寫底層系統軟件的高級程序設計語言
,C++ 用 inline 關鍵字較好地解決了函數調用開銷的問題。

完整代碼demo,請移步GitHub:DDGLearningCpp

當然C++大神就繞吧,非喜勿噴,畢竟這是個人的學習筆記📒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章