如下代碼 using namespace std; int sum(int a,int b){ return a + b; } int main(){ int a =1; int b =2; int ret =sum(a,b); return 0; } 上面sum函數調用,會涉及到參數壓棧,函數棧幀 ...
如下代碼
using namespace std;
int sum(int a,int b){
return a + b;
}
int main(){
int a =1;
int b =2;
int ret =sum(a,b);
return 0;
}
上面sum函數調用,會涉及到參數壓棧,函數棧幀的開闢及回退過程,因此在函數調用的過程時候是會有開銷的
sum函數的核心功能轉成彙編指令即 1:將x的值放入寄存器 2:再將y的值和寄存器內容相加
為了使用這個非常簡單的功能,我們需要做許多額外的動作,例如壓函數參數入棧,壓下一條執行指令地址入棧,將main函數的棧底指針壓棧,為sum 函數開闢棧幀,
這一些系列動作產生的彙編指令遠遠多於x+y產生的指令, 這個就是說函數的調用開銷遠遠大於函數功能指令,這種情況下我們可以考慮內聯函數
如下代碼
using namespace std;
inline int sum(int a,int b){
return a + b;
}
int main(){
int a =1;
int b =2;
int ret =sum(a,b);
return 0;
}
inline內聯函數:在函數編譯的過程中,就不會產生函數調用開銷了,在函數的調用點直接把函數的代碼進行展開處理了,
同時inline函數不再產生相應的函數符號
但是註意:不是所有的內聯函數都會被編譯器處理成內聯函數,比如遞歸
所以inline只是建議編譯器把這個函數處理成內聯函數,結果取決於編譯器,有沒有內聯成功可以 看看符號表,函數是否產生符號.
debug版本下,inline是不起作用,只有在release版本下才起作用
內聯函數於普通函數有什麼區別?
1:普通函數的調用會有函數開銷
2:內聯函數在編譯的過程中,編譯器會將函數代碼做展開處理
3:如果內聯成功,函數將不再產生符號表