C 內聯函式(inline)詳解

2021-09-29 13:26:16 字數 1356 閱讀 1380

內聯函式

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

內聯函式是c++為提高程式執行速度所做的一項改進。內聯函式的編譯**與其他程式**「內聯」起來了,也就是說,編譯器將使用相應的函式**替換函式呼叫,對於內聯函式,程式無需跳到另乙個位置處執行**,然後再跳回來。因此,內聯函式的執行速度比常規函式稍快,但代價是需要占用更多的記憶體。如果程式在10個不同的地方呼叫同乙個內聯函式,則該程式將包含該函式的10個**拷貝。

在使用過程中,應該有選擇的使用內聯函式,如果函式體**比較多,需要較長的執行時間,那麼函式呼叫機制占用的時間可以忽略;如果函式只有一兩條語句,那麼大部分的時間都會花費在函式呼叫機制上,特別是這種比較短小的函式經常被呼叫,那麼這種時間開銷就不容忽視了。

內聯函式的使用方法

使用內聯函式只要採用下列措施之一就可以了:

在函式宣告前加上關鍵字 inline。

在函式定義前加上關鍵字 inline。

通常的做法是省略原型,將整個定義(即函式頭和所有函式**)放在本應該提供原型的地方。

如果是在多檔案程式設計時,建議將內聯函式的定義直接放在標頭檔案中,並且禁用內聯函式的宣告(宣告是多此一舉)

例如:

#include

using

namespace std;

//內聯函式,交換兩個數的值

inline

double

square

(double x)

intmain()

內聯函式與巨集定義

巨集定義是可以帶引數的,不過和函式還是有一定的區別。巨集定義僅僅是字串替換,不是按值傳遞的,所以在編寫巨集定義時要特別小心。例如:

#define  square(x)  x*x

a =square(4

);//被替換成 a = 4 * 4

a =square(4

+1);

//被替換成 a = 4 + 1 * 4 + 1,這裡和我們的設計初衷就不一樣了。

內聯函式與巨集定義不同,c++編譯器在編譯時也會對內聯函式進行錯誤分析。它在某種角度上看,有點像標籤,即內聯函式在編譯時也會直接替換相應的標籤,但是內聯函式提供給程式設計師的樣子卻是乙個函式的形式。可以把內聯函式看做是巨集定義的高階版本。inline 修飾的函式在執行時沒有函式呼叫的開銷的,但是對外又表現出函式的形態。因此,如果使用c語言的巨集定義執行了類似函式的功能,應考慮將它們轉換為c++的內聯函式。

inline內聯函式詳解

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

inline 內聯函式詳解

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

inline函式 C 內聯函式 inline

inline要起作用,必須要與函式定義放在一起,而不是函式的宣告 inline 當編譯器處理呼叫內聯函式的語句時,不會將該語句編譯成函式呼叫的指令,而是直接將整個函式體的 插人呼叫語句處,就像整個函式體在呼叫處被重寫了一遍一樣,在執行時是順序執行,而不會進行跳轉。優點 內聯函式沒有執行函式呼叫的開銷...