C 內聯函式 inline

2021-09-25 06:59:56 字數 1352 閱讀 6287

內聯函式並不是什麼高大上的概念,如果學過c語言的同學,一定知道c語言中的巨集定義(#define),內聯函式的作用與巨集非常類似。

當c++的**執行到某乙個函式的時候,會記錄該處的位址。然後,去記憶體中找到對應函式定義所在的**段,將實參複製到堆疊之中,隨後執行相應的函式**,執行完之後再返回之前儲存的位址。這整個過程稱為一次函式呼叫。如果個別的函式被呼叫的次數很多,而函式本身執行的時間較短。比如在乙個大型的計算程式中,可能要經常呼叫到平方函式。這時,如果能減少函式的呼叫過程,那麼,將可以給程式的執行節省很多的時間,

巨集定義與內聯函式的運用,就是實現**的替換,將函式的定義直接替換到**中,免去了函式呼叫的時間,但與此同時,也會帶來很多空間上的開銷。因此,對於較為複雜且需要多次呼叫的函式,在使用內聯函式前,需要權衡一下時間和空間的占用,再做定奪。

在函式宣告和定義前加上inline關鍵字。省略函式原型,將整個函式定義放在本應提供原型的地方。

示例程式:

#includeusing namespace std;

inline double sqrt(double x)

int main()

1️⃣內聯函式不能遞迴。

2️⃣如果函式定義占用多行,使用內聯函式就不太合適。

舉乙個巨集定義最簡單的例子。以下**的意思就是以後遇到max_value的時候,用5去替換即可。

#define max_value 5;
當然,巨集定義也可以用於函式,如第2小節中的sqrt(x),可以用巨集定義表示為:

#define sqrt(x) x*x
函式執行到sqrt(x)的時候,如果輸入是基本型別,也能得到正確結果。但是,如果輸入變成了表示式,如x+2,這時,巨集定義將不能正確輸出了。請看一下示例**:

#includeusing namespace std;

inline double sqrt(double x)

#define pingfang_1(x) x*x

#define pingfang_2(x) ((x)*(x))

int main()

使用下面的形式雖然可以解決表示式的問題,但是,一旦遇到自加、自減時,就又會陷入錯誤。因為這裡會吧a++執行兩次。

#define pingfang_2(x) ((x)*(x))
為什麼內聯函式卻每次都能輸出正確的結果呢?因為不同於巨集的簡單替換,內聯函式與常規函式一樣,在傳遞引數的時候,都是進行的值傳遞!因此,在以後的程式設計中,如果使用c語言中的巨集來執行類似函式的功能,應當考慮替換為c++中的內聯函式。

inline函式 C 內聯函式 inline

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

C 內聯函式 inline

巨集 就是使用乙個字串來代替乙個表示式 或函式呼叫 編譯之前,預處理器會使用這個巨集字串所代表的表示式 或函式呼叫 來替換所有出現的巨集字串,這樣的話,用巨集表示的函式呼叫 就不用另外開闢函式棧,不用保護和恢復函式呼叫現場,這樣就提高了 的執行效率 所以,呼叫乙個巨集比呼叫乙個函式更有效 但是呼叫巨...

c 內聯函式inline

1.inline原理 在程式編譯時,編譯器將程式中出現的內聯函式的呼叫表示式用內聯函式的函式體來進行替代。採用空間換時間的策略。是以 膨脹 複製 為代價,僅僅省去了函式呼叫的開銷,從而提高函式的執行效率。例如 如果乙個函式被指定為inline函式,則它將在程式中每個呼叫點上被展開。int i 10 ...