C 內聯函式

2021-10-09 09:35:51 字數 2823 閱讀 5530

內聯函式在編譯時進行展開,在呼叫點處產生乙個函式體**的拷貝。因此,對內聯函式進行任何修改後,都需要對所有呼叫該函式的模組進行重新編譯,否則它將會繼續使用舊的函式。

如果想把乙個函式定義為內聯函式,則需要在函式名前面放置關鍵字 inline,在呼叫函式之前需要對函式進行定義。如果已定義的函式多於一行,編譯器會忽略 inline 限定符。

內聯函式的作用:

引入內聯函式的目的是為了解決程式中函式呼叫的效率問題,函式的呼叫會有函式棧幀的開闢和函式內資源**處理時產生的開銷。如果函式功能比較簡單,如整數比較大小函式int compare_int(int a,int b),此時函式體很小,而呼叫函式的開銷卻很大,呼叫這樣的函式效率不會很高。如果我們使用巨集定義的方式呼叫巨集函式,效率是有了保證,可函式安全性就沒***了。巨集展開是在預編譯階段進行的,該階段只是做簡單的替換和展開工作,沒有型別檢查不安全。因此,內聯函式的編譯時在呼叫點展開的特性剛好可以解決這個問題。

提問:

內聯函式什麼時候展開?

編譯期展開(如果在預編譯期展開不會檢查型別)

內聯函式一定會展開嗎?

inline是對編譯器的乙個建議,編譯器會根據具體情況考慮是否處理。如遞迴函式不可以是內聯函式。

其中,內聯函式在編譯時(vs 2019):

在debug中可以除錯,會產生乙個local符號,也會進行函式棧幀開闢之類的動作

在realse版本中,不會產生符號和棧幀的開闢,會在呼叫點進行展開

內聯函式、巨集函式和普通函式比較:

inline函式

static函式

巨集函式符號

debug中產生local符號,realse中不產生符號

產生local符號

不產生符號

棧幀debug中進行開闢棧幀等操作,realse直接在呼叫點展開(編譯器)

進行棧指標操作

在呼叫點展開(預編譯期)

除錯可以除錯

可以除錯

不可以除錯

安全有型別檢查

有型別檢查

沒有型別檢查

**分析:對於求和函式sum()的分析。

#include

using

namespace std;

#define sum(a,b)

// 巨集函式

intsum

(int a,

int b)

//普通函式 global符號

/* 開銷(**函資源)

pop ……

mov esp,ebp

pop ebp

ret*/

inline

intsum2

(int a,

int b)

//內斂函式 不產生符號(realse) debug產生local符號

inline

intsum3

(int a,

int b)

;//宣告在編譯期產生符號,存在符號表中 *und*

static

intsum4

(int a,

int b)

//靜態函式 local

// 實現求和運算 -> sun(int,int)

intmain()

引用:以下引用自部落格 內聯函式的宣告和定義

inline函式的規則

乙個函式可以自已呼叫自已,稱為遞迴呼叫(後面講到),含有遞迴呼叫的函式不能設定為inline

使用了複雜流程控制語句:迴圈語句和switch語句,無法設定為inline

由於inline增加體積的特性,所以建議inline函式內的**應很短小。最好不超過5行。

inline僅做為一種「請求」,特定的情況下,編譯器將不理會inline關鍵字,而強制讓函式成為普通函式。出現這種情況,編譯器會給出警告訊息。

在你呼叫乙個內聯函式之前,這個函式一定要在之前有宣告或已定義為inline,如果在前面宣告為普通函式,而在呼叫**後面才定義為乙個inline函式,程式可以通過編譯,但該函式沒有實現inline。比如下面**片段:最終沒有實現inline;

//函式一開始沒有被宣告為inline:

void

foo();

//然後就有**呼叫它:

foo();

//在呼叫後才有定義函式為inline:

inline

void

foo(

)

為了除錯方便,在程式處於除錯階段時,所有內聯函式都不被實現

使用內聯函式時應注意以下幾個問題:

在乙個檔案中定義的內聯函式不能在另乙個檔案中使用。它們通常放在標頭檔案中共享

內聯函式應該簡潔,只有幾個語句,如果語句較多,不適合於定義為內聯函式

內聯函式體中,不能有迴圈語句、if語句或switch語句,否則,函式定義時即使有inline關鍵字,編譯器也會把該函式作為非內聯函式處理。

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

C 內聯函式

1 什麼是內聯函式?內聯函式就是小型函式,犧牲空間來節省函式呼叫的開銷,一般用作比較小的函式,即函式內部沒有迴圈 開關語句等。內聯函式被發明出來就是為了取代c中的巨集,因為巨集是單純的替換而沒有型別檢查所以經常出毛病,2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率...

C 內聯函式

1 什麼是內聯函式?2 為什麼要引入內聯函式?3 為什麼inline能取代巨集?4 內聯函式和巨集的區別?5 什麼時候用內聯函式?6 如何使用內聯函式?7 內聯函式的優缺點?8 如何禁止函式進行內聯?9 注意事項 1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內...

c 內聯函式

1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內。2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率問題。另外,前面我們講到了巨集,裡面有這麼乙個例子 define abs x x 0?x x 當 i出現時,巨集就會歪曲我們的意思...