內聯(inline)函式的優缺點
阿新 • • 發佈:2019-01-01
最近在看LinuxKernel Development,這本書主要是講了Linux核心的概念,對於整體的框架有了一個描述,這裡記錄下看到的一些有用的東西,便於以後整理。
Inline這個名稱就可以反映出它的工作方式,函式會在它所呼叫的位置上展開。這麼做可以消除函式呼叫和返回所帶來的開銷(暫存器儲存和恢復),而且,由於編譯器會把呼叫函式的程式碼和函式本身放在一起優化,所以也有進一步優化程式碼的可能。不過這麼做是有代價的,程式碼會變長,這就意味著佔用更多的記憶體空間或者佔用更多的指令快取。核心開發者通常把那些對時間要求比較高,而本身長度又比較短的函式定義成行內函數。如果你把一個大塊頭的程式做成了行內函數,卻不需要爭分奪秒,反而反覆呼叫它,這麼做就失去了內聯的意義了。
總結:對於簡短的函式並且呼叫次數比較多的情況,適合使用行內函數。
使用方法:定義一個行內函數的時候,需要使用static作為關鍵字,並且用inline限定它(沒試過,暫且留在這裡)。比如:
static inline void dog(unsigned long tail_size);
行內函數必須在使用前就定義好,否則編譯器就沒法把這個函式展開。實踐中一般在標頭檔案中定義行內函數。由於使用了static作為關鍵字進行限制,所以在編譯時不會為行內函數單獨建一個函式體(這裡不太明白)。如果一個行內函數僅僅在某個原始檔中使用,那麼也可以把它定義在該檔案開始的地方。
注意:在核心中,為了型別安全的原因,優先使用行內函數而不是複雜的巨集。