C 內聯函式(C inline)詳解

2021-10-01 19:38:05 字數 2046 閱讀 6230

普通函式的缺點:

乙個功能,封裝到函式裡面呼叫,和直接寫這段**

前者可以避免多次重寫,減少程式體積,但是還是有小小的缺點,會給程式帶來額外的時間上的開銷,因為函式執行時要分配空間,傳參,將返回位址放入棧等

內聯函式的應用場景

函式被用在大量的迴圈中,並且函式自身執行時間很短

如果乙個函式內部沒有幾條語句,執行時間本來就非常短,那麼這個函式呼叫產生的額外開銷和函式本身執行的時間相比,就顯得不能忽略了。

假如這樣的函式在乙個迴圈中被上千萬次地執行,函式呼叫導致的時間開銷可能就會使得程式執行明顯變慢。

為了解決這問題,可以使用內聯函式,內聯函式會直接把函式體的所有**插入呼叫語句處

備註:使用內聯函式會使最終可執行程式的體積增加

以時間換取空間,或增加空間消耗來節省時間,這是計算機學科中常用的方法

有時函式看上去很簡單,例如只有乙個包含一兩條語句的迴圈,但該迴圈的執行次數可能很多,要消耗大量時間,那麼這種情況也不適合將其實現為內聯函式

內聯函式的inline和函式體定義放在一起,和函式宣告不起作用(一般函式宣告不加inline)。

編譯器會根據函式**的長度來決定是否內聯, 在類中定義的函式多於 1 行, 則忽略 inline 關鍵字; 同時在外部定義的內聯函式超過 10 行左右也會被忽略 inline. 這種校正規則一定程度上減少了**臃腫的問題

inline對於編譯器而言只是乙個建議,編譯器會自動優化,如果定義為inline的函式體內有迴圈/遞迴等等,編譯器優化時會忽略掉內聯。

內聯函式是可除錯的,在debug版本中沒有實現真正的內聯,release中才會

類宣告中的成員函式會自動轉為內聯函式。(建構函式和析構函式可能會呼叫基類的函式,所以不能輕易將其轉為內聯函式)。

詳細描述:

使用函式能夠避免將相同**重寫多次的麻煩,還能減少可執行程式的體積,但也會帶來程式執行時間上的開銷。

函式呼叫在執行時,首先要在棧中為形參和區域性變數分配儲存空間,然後還要將實參的值複製給形參,接下來還要將函式的返回位址(該位址指明了函式執行結束後,程式應該回到**繼續執行)放入棧中,最後才跳轉到函式內部執行。這個過程是要耗費時間的。

另外,函式執行 return 語句返回時,需要從棧中**形參和區域性變數占用的儲存空間,然後從棧中取出返回位址,再跳轉到該位址繼續執行,這個過程也要耗費時間。

總之,使用函式呼叫語句和直接把函式中的**重新抄寫一遍相比,節省了人力,但是帶來了程式執行時間上的額外開銷。

一般情況下,這個開銷可以忽略不計。但是,如果乙個函式內部沒有幾條語句,執行時間本來就非常短,那麼這個函式呼叫產生的額外開銷和函式本身執行的時間相比,就顯得不能忽略了。假如這樣的函式在乙個迴圈中被上千萬次地執行,函式呼叫導致的時間開銷可能就會使得程式執行明顯變慢。

作為特別注重程式執行效率,適合編寫底層系統軟體的高階程式語言,c++ 用 inline 關鍵字較好地解決了函式呼叫開銷的問題。

在 c++ 中,可以在定義函式時,在返回值型別前面加上 inline 關鍵字。如:

inline

int max (

int a,

int b)

增加了 inline 關鍵字的函式稱為「內聯函式」。內聯函式和普通函式的區別在於:當編譯器處理呼叫內聯函式的語句時,不會將該語句編譯成函式呼叫的指令,而是直接將整個函式體的**插人呼叫語句處,就像整個函式體在呼叫處被重寫了一遍一樣。

有了內聯函式,就能像呼叫乙個函式那樣方便地重複使用一段**,而不需要付出執行函式呼叫的額外開銷。很顯然,使用內聯函式會使最終可執行程式的體積增加。以時間換取空間,或增加空間消耗來節省時間,這是計算機學科中常用的方法。

內聯函式中的**應該只是很簡單、執行很快的幾條語句。如果乙個函式較為複雜,它執行的時間可能上萬倍於函式呼叫的額外開銷,那麼將其作為內聯函式處理的結果是付出讓**體積增加不少的代價,卻只使速度提高了萬分之一,這顯然是不划算的。

有時函式看上去很簡單,例如只有乙個包含一兩條語句的迴圈,但該迴圈的執行次數可能很多,要消耗大量時間,那麼這種情況也不適合將其實現為內聯函式。

另外,需要注意的是,呼叫內聯函式的語句前必須已經出現內聯函式的定義(即整個數體),而不能只出現內聯函式的宣告。

C inline 內聯函式

內聯函式 1 內聯函式定義和作用 將乙個函式宣告為inline,那麼函式就成為內聯函式。內聯函式通常就是它在程式中每個呼叫點上 內聯地 展開。從定義上看,內聯函式跟一般函式不一樣,一般函式呼叫的時候是需要呼叫開銷的 比如出棧入棧等操作 內聯函式從定義上看更像是巨集,但是跟巨集不一樣。內聯函式的作用主...

C inline內聯函式探索

學過程式編譯的人知道,呼叫函式需要cpu執行引數壓棧 暫存器儲存與恢復 跳轉指令等操作,開銷比較大,高頻繁的呼叫函式對效能有影響,在c c 語言裡產生了macro巨集,由於巨集不是函式不會產生上述開銷,是一種比較好的優化,但巨集不是強型別程式設計,於是vc 產生了inline內聯函式,inline優...

C Inline 內聯函式小結

為解決 中頻繁呼叫小函式,消耗大量棧空間的問題,因而引入修飾符inline。執行速度比常規函式稍快,但以 膨脹為代價 函式內聯,節約的是處理函式呼叫機制的時長。若函式執行時間短,函式內聯的效益較高,反之效益降低 使用限制 1 不可遞迴使用 2 函式體較大的時候不適合使用 3 必須和函式定義放在一起才...