C 內聯函式的使用

2021-07-23 20:32:33 字數 1459 閱讀 7094

對於乙個頻繁使用的短小函式,在c語言中用巨集實現,在c++中應用什麼實現?

答案是:內聯函式

1、內聯函式的原理

編譯器將使用相應的函式**替換函式呼叫。

例如,如果乙個函式被指定為inline 函式則它將在程式中每個呼叫點上被內聯地展開

int minval2 = min( i, j );  ====>  int minval2 = i < j << i : j; 

inline的原理,是用空間換取時間的做法,是以**膨脹(複製)為代價,僅僅省去了函式呼叫的開銷,從而提高函式的執行效率。

因此,內聯函式的執行速度比常規函式稍快,但代價是需要占用更多記憶體。

如果執行函式體內**的時間,相比於函式呼叫的開銷較大,那麼效率的收穫會很少。所以,如果函式體**過長或者函式體重有迴圈語句,if語句或switch語句或遞迴時,不宜用內聯。

2、內聯函式的使用

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

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

ps:關鍵字inline 必須與函式定義體放在一起才能使函式成為內聯,僅將inline 放在函式宣告前面不起任何作用。內聯函式呼叫前必須宣告。

inline 是一種「用於實現的關鍵字」,而不是一種「用於宣告的關鍵字」。

tips:只在定義前加上inline,而不是在宣告和定義前都加,這能體現高質量c++/c 程式設計風格的乙個基本原則:宣告與定義不可混為一談。

3、內聯函式與巨集定義的區別

c語言使用預處理器語句#define來提供巨集。如下例所示:

#define square(x) x*x
巨集定義是通過文字替換實現的--x是引數的符號標記。

可以將內聯理解為c++中對於函式專有的巨集,對於c的函式巨集的一種改進。對於常量巨集,c++提供const替代;而對於函式巨集,c++提供的方案則是inline。在c中,大家都知道巨集的優勢,編譯器通過複製巨集**的方式,省去了引數壓棧,生成彙編的call呼叫,返回引數等操作,雖然存在一些安全隱患,但在效率上,還是很可取的。

但是巨集定義有不少缺陷:

a、在複製**時,容易出現一想不到的邊際效應

a = square(5.0);->a=5.0*5.0;

b = square(4.5+7.5);->b=4.5+7.5*4.5+7.5

d = square(c++);->d=c++*c++

可以看出,對於b,需要使用括號才能正常運算。

#define square(x) ((x)*(x))
對於c,卻仍遞增了兩次。因此,巨集定義和內聯函式存在本質的區別,轉換的時候應考慮是否轉換後功能是否正常。

b.使用巨集,無法進行除錯,雖然windows提供了assert巨集

c.使用巨集,無法訪問類的私有成員

c++ 通過內聯機制,既具備巨集**的效率,又增加了安全性,還可以自由操作類的資料成員,算是乙個比較完美的解決方案。

c 內聯函式的使用

學過計算機基礎的人都知道,程式設計講究效率。plus 在c語言中,巨集定義是我們保護效率的一大妙招,巨集 處不加驗證的簡單替代,在編譯前將程式中有關字串替換成巨集體 如 defin pi 3.14,用3.14替換pi這個字元在程式執行前。但是在c 中,由於私有成員不能訪問,巨集作用為成員函式就很無用...

c 內聯函式使用技巧

c 語言新增關鍵字 inline,用於將乙個函式宣告為內聯函式。在程式編譯時,編譯器會將內聯函式呼叫處用函式體替換,這一點類似於c語言中的巨集擴充套件。採用內聯函式可以有效避免函式呼叫的開銷,程式執行效率更高。使用內聯函式的缺點就是,如果被宣告為內聯函式的函式體非常大,則編譯器編譯後程式的可執行碼將...

C 內聯函式的說明及使用

在說明內聯函式之前,我們需要先簡單介紹一下函式的執行過程。我們寫的 最終會被編譯成可執行程式,這些程式是機器可以識別的機器語言,然後當我們執行程式時,這些 被載入到記憶體當中。一般在呼叫函式時,函式呼叫後立即儲存該指令的記憶體位址,並把函式的引數拷貝到堆疊空間,然後程式跳轉到該函式起點的記憶體單元,...