inline內聯函式詳解

2021-07-14 13:36:58 字數 2161 閱讀 6737

內聯函式:

tip: 只有當函式只有 10 行甚至更少時才將其定義為內聯函式.

定義: 當函式被宣告為內聯函式之後, 編譯器會將其內聯展開, 而不是按通常的函式呼叫機制進行呼叫.

優點: 當函式體比較小的時候, 內聯該函式可以令目標**更加高效. 對於訪問函式以及其它函式體比較短, 效能關鍵的函式, 鼓勵使用內聯.

缺點: 濫用內聯將導致程式變慢. 內聯可能使目標**量或增或減, 這取決於內聯函式的大小. 內聯非常短小的訪問函式通常會減少**大小, 但內聯乙個相當大的函式將戲劇性的增加**大小. 現代處理器由於更好的利用了指令快取, 小巧的**往往執行更快。

結論: 乙個較為合理的經驗準則是, 不要內聯超過 10 行的函式. 謹慎對待析構函式, 析構函式往往比其表面看起來要更長, 因為有隱含的成員和基類析構函式被呼叫!

另乙個實用的經驗準則: 內聯那些包含迴圈或 switch 語句的函式常常是得不償失 (除非在大多數情況下, 這些迴圈或 switch 語句從不被執行).

有些函式即使宣告為內聯的也不一定會被編譯器內聯, 這點很重要; 比如虛函式和遞迴函式就不會被正常內聯. 通常, 遞迴函式不應該宣告成內聯函式.(遞迴呼叫堆疊的展開並不像迴圈那麼簡單, 比如遞迴層數在編譯時可能是未知的, 大多數編譯器都不支援內聯遞迴函式). 虛函式內聯的主要原因則是想把它的函式體放在類定義內, 為了圖個方便, 抑或是當作文件描述其行為, 比如精短的訪問函式.

-inl.h檔案:

tip: 複雜的內聯函式的定義, 應放在字尾名為 -inl.h 的標頭檔案中.

內聯函式的定義必須放在標頭檔案中, 編譯器才能在呼叫點內聯展開定義. 然而, 實現**理論上應該放在 .cc 檔案中, 我們不希望 .h 檔案中有太多實現**, 除非在可讀性和效能上有明顯優勢.

如果內聯函式的定義比較短小, 邏輯比較簡單, 實現**放在 .h 檔案裡沒有任何問題. 比如, 訪問函式的實現理所當然都應該放在類定義內. 出於編寫者和呼叫者的方便, 較複雜的內聯函式也可以放到 .h 檔案中, 如果你覺得這樣會使標頭檔案顯得笨重, 也可以把它萃取到單獨的 -inl.h 中. 這樣把實現和類定義分離開來, 當需要時包含對應的 -inl.h 即可。

a. 使用inline關鍵字的函式會被編譯器在呼叫處展開

b. 標頭檔案中可以包含inline函式的宣告

c. 可以在同乙個專案的不同原始檔內定義函式名相同但實現不同的inline函式

d. 定義在class宣告內的成員函式預設是inline函式

e. 優先使用class宣告內定義的inline函式

f. 優先使用class實現的內inline函式的實現

解析:a 如果只宣告含有inline關鍵字,就沒有內聯的效果。 內聯函式的定義必須放在標頭檔案中, 編譯器才能在呼叫點內聯展開定義.有些函式即使宣告為內聯的也不一定會被編譯器內聯, 這點很重要; 比如虛函式和遞迴函式就不會被正常內聯. 通常, 遞迴函式不應該宣告成內聯函式.

b 內聯函式應該在標頭檔案中定義,這一點不同於其他函式。編譯器在呼叫點內聯展開函式的**時,必須能夠找到 inline 函式的定義才能將呼叫函式替換為函式**,而對於在標頭檔案中僅有函式宣告是不夠的。

c 當然內聯函式定義也可以放在原始檔中,但此時只有定義的那個原始檔可以用它,而且必須為每個原始檔拷貝乙份定義(即每個原始檔裡的定義必須是完全相同的),當然即使是放在標頭檔案中,也是對每個定義做乙份拷貝,只不過是編譯器替你完成這種拷貝罷了。但相比於放在原始檔中,放在標頭檔案中既能夠確保呼叫函式是定義是相同的,又能夠保證在呼叫點能夠找到函式定義從而完成內聯(替換)。

對於由兩個檔案compute.c和draw.c構成的程式來說,程式設計師不能定義這樣的min()函式,它在compute.c中指一件事情,而在draw.c中指另外一件事情。如果兩個定義不相同,程式將會有未定義的行為:

為保證不會發生這樣的事情,建議把inline函式的定義放到標頭檔案中。在每個呼叫該inline函式的檔案中包含該標頭檔案。這種方法保證對每個inline函式只有乙個定義,且程式設計師無需複製**,並且不可能在程式的生命期中引起無意的不匹配的事情。
d 正確。 定義在類宣告之中的成員函式將自動地成為內聯函式,例如:

class a // 自動地成為內聯函式 }

e、f 在每個呼叫該inline函式的檔案中包含該標頭檔案。這種方法保證對每個inline函式只有乙個定義,且程式設計師無需複製**,並且不可能在程式的生命期中引起無意的不匹配的事情。最好只有乙個定義!

inline 內聯函式詳解

一 inline 關鍵字用來定義乙個類的 內聯函式,引入它的主要原因是用它替代c中 表示式形式的 巨集定義。表示式形式的 巨集定義一例 define expressionname var1,var2 var1 var2 var1 var2 為什麼要取代這種形式呢,且聽我道來 1 首先談一下在c中使用...

C 內聯函式(inline)詳解

內聯函式 函式呼叫是有時間和空間開銷的。程式在執行乙個函式之前需要做一些準備工作,要將實參 區域性變數 返回位址以及若干暫存器都壓入棧中,然後才能執行函式體中的 在函式體中的 執行完畢後還要恢復現場,將之前壓入棧中的資料都出棧,才能接著執行函式呼叫位置以後的 內聯函式是c 為提高程式執行速度所做的一...

iOS OC內聯函式 inline的詳解

在ios中的一些框架中,static inline是經常出現的關鍵字組合.static inline cgfloat cgfloatfrompixel cgfloat value yyscreenscale 方法說明 cgfloat yyscreenscale return scale 雖然stat...