通常,函式呼叫都有一定的開銷,因為函式的呼叫過程包括建立呼叫、 傳遞引數、跳轉到函式**並返回。使用巨集使**內聯,可以避免這樣的開 銷。c99還提供另一種方法:內聯函式(inline function)。
可能顧名思義地認為內聯函式會用內聯**替換函式呼叫。
其實c99和c11標準中敘述 的是:「把函式變成內聯函式建議盡可能快地呼叫該函式,其具體效果由實 現定義」。因此,把函式變成內聯函式,編譯器可能會用內聯**替換函式 呼叫,並(或)執行一些其他的優化,但是也可能不起作用。
建立內聯函式的定義有多種方法。標準規定具有內部鏈結的函式可以成為內聯函式,還規定了內聯函式的定義與呼叫該函式的**必須在同乙個檔案中。
因此,最簡單的方法是使用函式說明符 inline 和儲存類別說明符 static。通常,內聯函式應定義在首次使用它的檔案中,所以內聯函式也相當於函式原型。如下所示:
#include
inline
static
void
eatline()
// 內聯函式定義/原型
intmain()
編譯器檢視內聯函式的定義(也是原型),可能會用函式體中的**替換 eatline()函式呼叫。也就是說,效果相當於在函式呼叫的位置輸入函式體 中的**:
#include
inline
static
void
eatline()
//內聯函式定義/原型
intmain()
由於並未給內聯函式預留單獨的**塊,所以無法獲得內聯函式的位址
(實際上可以獲得位址,不過這樣做之後,編譯器會生成乙個非內聯函式)。另外,內聯函式無法在偵錯程式中顯示。
內聯函式應該比較短小。把較長的函式變成內聯並未節約多少時間,因 為執行函式體的時間比呼叫函式的時間長得多。
編譯器優化內聯函式必須知道該函式定義的內容。這意味著內聯函式定義與函式呼叫必須在同乙個檔案中。鑑於此,一般情況下內聯函式都具有內部鏈結。因此,如果程式有多個檔案都要使用某個內聯函式,那麼這些檔案中都必須包含該內聯函式的定義。最簡單的做法是,把內聯函式定義放入標頭檔案,並在使用該內聯函式的檔案中包含該標頭檔案即可。
// eatline.h
#ifndef eatline_h_
#define eatline_h_
inline
static
void
eatline()
#endif
一般都不在標頭檔案中放置可執行**,內聯函式是個特例。因為內聯函式具有內部鏈結,所以在多個檔案中定義同乙個內聯函式不會產生什麼問題。
與c++不同的是,c還允許混合使用內聯函式定義和外部函式定義(具有外部鏈結的函式定義)。例如,乙個程式中使用下面3個檔案:
.inline
static
double
square
(double);
double
square
(double x)
intmain()
void
spam
(double v)
void
masp
(double w)
{double kw =
square
(w);..
.
如上述**所示,3個檔案中都定義了square()函式。file1.c檔案中是 inline static定義;file2.c 檔案中是普通的函式定義(因此具有外部鏈結); file3.c 檔案中是 inline 定義,省略了static。
3個檔案中的函式都呼叫了square()函式,這會發生什麼情況?。file1.c 檔案中的main()使用square()的區域性static定義。由於該定義也是inline定義, 所以編譯器有可能優化**,也許會內聯該函式。file2.c 檔案中,spam()函 數使用該檔案中 square()函式的定義,該定義具有外部鏈結,其他檔案也可 見。file3.c檔案中,編譯器既可以使用該檔案中square()函式的內聯定義,也 可以使用file2.c檔案中的外部鏈結定義。如果像file3.c那樣,省略file1.c檔案 inline定義中的static,那麼該inline定義被視為可替換的外部定義。
注意gcc在c99之前就使用一些不同的規則實現了內聯函式,所以gcc 可以根據當前編譯器的標記來解釋inline。
C語言內聯函式
1 內聯函式 c 中關鍵字 inline 用法解析 測試 inlinetest.c include inlinetest.h include stdio.h define adddefine a,b,val do while 0 inline int addinline int a,int b in...
內聯函式 C語言的inline內聯函式的作用
編譯器完成的,在呼叫處將函式展開,減少了呼叫函式時 進棧和出棧 壞處是會增加 段的大小 缺點 增加了編譯後的二進位制檔案的大小 為了提高執行的速度,對於一些程式 小,執行時間短但利用次數比較多的函式我們就定義為inline,對於短小的函式,可以省去call儲存現場等操作,提高程式執行速度。原文 分類...
C語言內聯函式inline
一 什麼是內聯函式 在c語言中,如果一些函式被頻繁呼叫,不斷地有函式入棧,即函式棧,會造成棧空間或棧記憶體的大量消耗。為了解決這個問題,特別的引入了inline修飾符,表示為內聯函式。棧空間就是指放置程式的區域性資料也就是函式內資料的記憶體空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因...