因為函式在呼叫時有空間和時間的開銷,特別是多次重複呼叫時開銷很大。所以c++中就引入內聯函式的概念,適用於短小,功能簡單,頻繁呼叫的函式,比如swap函式。
內聯函式就是將函式呼叫處,用函式體替換,這樣就沒有函式壓棧的開銷,類似於巨集替換。
簡單看乙個例子,add函式:
/*code 1*/
#include
using namespace std;
/*inline myadd(int a, int b)內聯函式的寫法*/
intmyadd
(int a,
int b)
intmain()
上面的**在反彙編下可以看到myadd函式的呼叫情況:
給第五行前面加上inline,將myadd設成內聯函式,再檢視彙編**如下:
這時沒有了函式呼叫壓棧的過程,這就是內聯函式。
內聯函式在編譯過程中,會被編譯器將呼叫函式處替換成函式體,這樣就增長了程式的**,**區要複製多份內聯函式體的**,同時函式定義處的**會被消除。
所以內聯函式是典型的空間換時間的做法。
因為內聯函式是程式設計師內部為了優化程式的操作,使用者不需要,也不應該知道這個函式在內部編譯時是什麼過程,所以建議內聯函式只定義,不宣告。並且將定義寫在標頭檔案中(多檔案程式設計),希望呼叫內聯函式時,引入對應的標頭檔案即可。
內聯函式的關鍵字inline,可以只在定義中新增,也可以只在宣告處新增,也可以兩個都新增。
但宣告和定義必須放在同乙個檔案,所以建議將內聯函式的定義放在標頭檔案中,那個檔案中需要,就在那個檔案中包入這個標頭檔案。
如果分開會有bug:
/*common.h*/
#includeusing namespace std;
inline void func();
/*func.h*/
#include"common.h"
//內聯函式的定義
void func()
/*main.cpp*/
#include"common.h"
int main()
編譯時發生錯誤:
error lnk2019: 無法解析的外部符號 「void __cdecl func(void)」 (?func@@yaxxz),該符號在函式 _main 中被引用內聯函式在編譯階段就會被替換。
func.cpp檔案在編譯階段變成了:
#includeusing namespace std;
inline void func();
//內聯函式的定義
void func()
main.cpp在編譯階段變成了:
#includeusing namespace std;
inline void func();
int main()
func.cpp 中有func()函式的定義和宣告,而main.cpp中只有函式的宣告和呼叫,沒有定義,這時編譯階段,程式是可以執行的,編譯器會在鏈結階段尋找main.cpp中對應的func()函式的定義,可是此時的內聯函式的定義已經被編譯器消除了,因為它是內聯函式,而且沒有位址,所以main.cpp根本找不到這個函式。
在vs2013中,關於檢視內聯函式的方法:
內聯函式
inline函式 C 內聯函式 inline
inline要起作用,必須要與函式定義放在一起,而不是函式的宣告 inline 當編譯器處理呼叫內聯函式的語句時,不會將該語句編譯成函式呼叫的指令,而是直接將整個函式體的 插人呼叫語句處,就像整個函式體在呼叫處被重寫了一遍一樣,在執行時是順序執行,而不會進行跳轉。優點 內聯函式沒有執行函式呼叫的開銷...
C 內聯函式 inline
巨集 就是使用乙個字串來代替乙個表示式 或函式呼叫 編譯之前,預處理器會使用這個巨集字串所代表的表示式 或函式呼叫 來替換所有出現的巨集字串,這樣的話,用巨集表示的函式呼叫 就不用另外開闢函式棧,不用保護和恢復函式呼叫現場,這樣就提高了 的執行效率 所以,呼叫乙個巨集比呼叫乙個函式更有效 但是呼叫巨...
c 內聯函式inline
1.inline原理 在程式編譯時,編譯器將程式中出現的內聯函式的呼叫表示式用內聯函式的函式體來進行替代。採用空間換時間的策略。是以 膨脹 複製 為代價,僅僅省去了函式呼叫的開銷,從而提高函式的執行效率。例如 如果乙個函式被指定為inline函式,則它將在程式中每個呼叫點上被展開。int i 10 ...