05-行內函數

東閣堂主發表於2019-02-08

寫在前面

接下來又要學一個關鍵字了--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++大神就繞吧,非喜勿噴,畢竟這是個人的學習筆記?

相關文章