c 中內斂函式 C 中內聯函式

2021-10-19 15:35:08 字數 2383 閱讀 5311

目錄

什麼是內聯函式

如何使函式內聯

為什麼要使用內聯函式

inline函式的優缺點分析

什麼時候該使用內聯函式

正文在c語言中,我們使用巨集定義函式這種借助編譯器的優化技術來減少程式的執行時間,那麼在c++中有沒有相同的技術或者更好的實現方法呢?答案是有的,那就是內聯函式。內聯函式作為編譯器優化手段的一種技術,在降低執行時間上非常有用。我們將從:

什麼是內聯函式

為什麼要使用內聯函式

內聯函式優缺點分析

何時使用內聯函式

這四個方面對內聯函式進行介紹。

什麼是內聯函式

內聯函式是c++的增強特性之一,用來降低程式的執行時間。當內聯函式收到編譯器的指示時,即可發生內聯:編譯器將使用函式的定義體來替代函式呼叫語句,這種替代行為發生在編譯階段而非程式執行階段。

值得注意的是,內聯函式僅僅是對編譯器的內聯建議,編譯器是否覺得採取你的建議取決於函式是否符合內聯的有利條件。如何函式體非常大,那麼編譯器將忽略函式的內聯宣告,而將內聯函式作為普通函式處理。

如何使函式內聯

定義函式時,在函式的最前面以關鍵字「inline」宣告函式,即可使函式稱為內聯宣告函式。

例如:class a

public:

inline int add(int a, int b)

return (a + b);

class a

public:

int add(int a, int b);

inline int a::add(int a, int b)

return (a + b);

為什麼要使用內聯函式

有時候我們會寫一些功能專一的函式,這些函式的函式體不大,包含了很少的執行語句。例如在計算1~1000以內的素數時,我們經常會使用開方操作使運算範圍縮小,這時我們會寫乙個函式:

int root(int n)

return (int)sqrt((float)n);

然後我們的求範圍內素數的函式可以這樣寫。

int prime(int n)

int i;

for (i = 2; i <= root(n); i++)

if (n%i == 0)

return 0;

return 1;

當然,把root函式放在迴圈中不是個不明智的選擇,但想象一下,在某個程式上下文內必須頻繁地呼叫某個類似root的函式,其呼叫函式的花銷會有多大:當遇到普通函式的呼叫指令時,程式會儲存當前函式的執行現場,將函式中的區域性變數以及函式位址壓入堆疊,然後再將即將呼叫的新函式載入到記憶體中,這要經歷複製引數值、跳轉到所呼叫函式的記憶體位置、執行函式**、儲存函式返回值等過程,當函式執行完後,再獲取之前正在呼叫的函式的位址,回去繼續執行那個函式,執行時間開銷簡直太多了。

c++內聯函式提供了替代函式呼叫的方案,通過inline宣告,編譯器首先在函式呼叫處使用函式體本身語句替換了函式呼叫語句,然後編譯替換後的**。因此,通過內聯函式,編譯器不需要跳轉到記憶體其他位址去執行函式呼叫,也不需要保留函式呼叫時的現場資料。

inline函式的優缺點分析

通過下面這些優缺點總結你大概會更理解為什麼要使用inline函式:

優點:它通過避免函式呼叫所帶來的開銷來提高你程式的執行速度。

當函式呼叫發生時,它節省了變數彈棧、壓棧的開銷。

它避免了乙個函式執行完返回原現場的開銷。

通過將函式宣告為內聯,你可以把函式定義放在標頭檔案內。

缺點:因為**的擴充套件,內聯函式增大了可執行程式的體積。

c++內聯函式的展開是中編譯階段,這就意味著如果你的內聯函式發生了改動,那麼就需要重新編譯**。

當你把內聯函式放在標頭檔案中時,它將會使你的標頭檔案資訊變多,不過標頭檔案的使用者不用在意這些。

有時候內聯函式並不受到青睞,比如在嵌入式系統中,嵌入式系統的儲存約束可能不允許體積很大的可執行程式。

什麼時候該使用內聯函式

當程式設計需要時,每個函式都可以宣告為inline。下面列舉一些有用的建議:

當對程式執行效能有要求時,那麼就使用內聯函式吧。

當你想巨集定義乙個函式時,那就果斷使用內聯函式吧。

在類內部定義的函式會預設宣告為inline函式,這有利於類實現細節的隱藏。

關鍵點內聯宣告只是一種對編譯器的建議,編譯器是否採用內聯措施由編譯器自己來決定。甚至在彙編階段或鏈結階段,一些沒有inline宣告的函式編譯器也會將它內聯展開。

編譯器的內聯看起來就像是**的複製與貼上,這與預處理巨集是很不同的:巨集是強制的內聯展開,可能將會汙染所有的命名空間與**,將為程式的除錯帶來困難。

所有中類中定義的函式都預設宣告為inline函式,所有我們不用顯示地去宣告inline。

虛函式不允許內聯。

雖然說模板函式放中標頭檔案中,但它們不一定是內聯的。(不是說定義在標頭檔案中的函式都是內聯函式)。

**:

c 中內斂函式 C 內聯函式

內聯函式是指用inline關鍵字修飾的函式。在類內定義的函式被預設成內聯函式。實質就是當需要呼叫乙個內聯函式時,不是去呼叫而是將該函式 整段插入到需要使用該內聯函式的地方,從而省去呼叫過程,提高了執行速度。缺點由於每當 呼叫到內聯函式,就需要在呼叫處直接插入一段該函式的 所以程式的體積將會增大,消耗...

c 中內斂函式 C 內聯函式 菜鳥教程

內聯函式 tip 只有當函式只有 10 行甚至更少時才將其定義為內聯函式.定義 當函式被宣告為內聯函式之後,編譯器會將其內聯展開,而不是按通常的函式呼叫機制進行呼叫.優點 當函式體比較小的時候,內聯該函式可以令目標 更加高效.對於訪問函式以及其它函式體比較短,效能關鍵的函式,鼓勵使用內聯.缺點 濫用...

c 中內斂函式 C 中的內聯函式分析

子宇24 1 本節課學習 c 中才引入的新的概念,內聯函式 2 常量與巨集回顧 3 內聯函式用法 1 inline int func int a,int b 2 內聯函式在表現形式上和普通函式一樣,但是它會被編譯器進行優化,編譯器直接將內聯函式的函式體進行擴充套件,這個擴充套件由編譯器直接將生成的 ...