c語言中的的內聯 inline 函式

2021-05-27 20:33:55 字數 1726 閱讀 5080

c/c++中的inline,使用在函式宣告處,表示程式設計師請求編譯器在此函式的被呼叫處將此函式實現插入,而不是像普通函式那樣生成呼叫**(申請是否有效取決於編譯器)。一般地說,這樣作的優點是省掉了呼叫函式的開銷;缺點則是可能會增加代所生成目標**的尺寸(二班的除外,二班情況下,inline函式甚至會返過來降低程式的效能)。

實際上,即使沒有手工指定inline函式,編譯器一般還會選擇一些**量較小但使用頻繁的函式作為inline函式,以此作為效能優化的途徑之一。

1. 和帶參巨集定義(parameterized macro)的比較

與帶參巨集定義相比,inline函式具備以下優點:

引數型別檢查:巨集定義中所使用的引數僅僅是在巨集定義中被替換,不進行任何的型別檢查 返回值:巨集定義中無法使用

return返回 便於除錯

2. 不同編譯器下的inline關鍵字

儘管c/c++有著自己的語言標準和規範,但不同編譯器實現中總會有著這樣或那樣的區別。inline即是一例。

c99標準

inline :用於同一c/cpp檔案內部被呼叫處展開;對外部檔案來說函式不可用

static inline :用於在同一c/cpp檔案內部被呼叫處展開;一般情況下,編譯器並不會為此函式生成單獨的目標**;如遇到內聯函式無法展開,或內聯函式以位址形式被呼叫,則編譯器將會為此內聯函式生成單獨的**;

簡單地說,c99中inline關鍵字申明的函式一般僅用於同一檔案,函式本身不會生成單獨的目標**;static關鍵字修訂後,如果需要,則會生成單獨的目標**。

gcc

inline :對同一c/cpp檔案,函式將會在被呼叫處展開;對外部檔案,此函式等同於"extern"函式

static inline :與c99標準中相同

extern inline : 僅用於同一c/c++檔案內部,在被呼叫處展開

gcc中的inline關鍵字與c99中不同,預設情況下(僅使用inline),在同一檔案中被呼叫處當作內聯函式展開,而在外部檔案呼叫中等同於普通extern函式(也就是說會生成單獨的目標**);加static關鍵字修訂後,反而不可應用於外部檔案,但如果需要可以生成單獨的目標**;gcc擴充套件的extern inline模式更是縮小函式的使用僅限於在同檔案中展開。

ms vc

ms vc中

inline的含義基本與c99中相同,此基礎上,作了一定擴充套件

__inline :等同於

inline

__forceinline :強制編譯器將函式作為內聯函式,除非以下情況

使用了/ob0選項編譯(debug編譯預設取值)

函式使用了可變引數

函式本身為遞迴函式,且未使用

#pragma inline_recursion(on)

函式為虛(virtual)函式

程式中使用了位址方式呼叫了函式

...

3. 其他

一般地,內聯函式不能是遞迴函式或呼叫遞迴函式(遞迴呼叫會給函式體展開帶來麻煩)。

inline應當是用於函式宣告(declaration)而非函式實現(implementation)。但由於由於不同的編譯器下inline關鍵字所修飾函式的呼叫範圍不一致,因此,一種簡單的作法是,將inline函式的宣告和實現合一。如果確定函式僅應用於同一檔案,我們可以將函式的宣告和實現都放在.c/.cpp中;否則將其放入.h中(這樣,包含了此標頭檔案的任何檔案都可以使用它)。

c語言中的的內聯 inline 函式

發表於2011 年 01 月 26 日 由 admin c c 中的inline,使用在函式宣告處,表示程式設計師請求編譯器在此函式的被呼叫處將此函式實現插入,而不是像普通函式那樣生成呼叫 申請是否有效取決於編譯器 一般地說,這樣作的優點是省掉了呼叫函式的開銷 缺點則是可能會增加代所生成目標 的尺寸...

C語言中的Inline內聯函式解析

在c語言中,為了解決一些頻繁呼叫的小函式大量消耗棧空間或是叫棧記憶體的問題,特別的引入了inline修飾符,表示為內聯函式。棧空間就是指放置程式的區域性資料也就是函式內資料的記憶體空間。那麼在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題 比如函式的死迴圈遞迴呼...

c語言中的inline

在c中,為了解決一些頻繁呼叫的小函式大量消耗棧空間或是叫棧記憶體的問題,特別的引入了inline修飾符,表示為內聯函式。棧空間就是指放置程式的區域性資料也就是函式內資料的記憶體空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,函式的死迴圈遞迴呼叫的最終結果...