內聯函式在編譯時進行展開,在呼叫點處產生乙個函式體**的拷貝。因此,對內聯函式進行任何修改後,都需要對所有呼叫該函式的模組進行重新編譯,否則它將會繼續使用舊的函式。
如果想把乙個函式定義為內聯函式,則需要在函式名前面放置關鍵字 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出現時,巨集就會歪曲我們的意思...