inline內聯函式

2021-10-14 11:47:47 字數 1227 閱讀 5220

1.什麼是內聯函式

用關鍵字inline修飾的函式就是內聯函式。關鍵字在函式宣告和定義的時候都要加上,不寫系統還是會當成常規函式

2.內聯函式與一般函式的區別

1)內聯含函式比一般函式在前面多乙個inline修飾符

2)內聯函式是直接複製「鑲嵌」到主函式中去的,就是將內聯函式的**直接放在內聯函式的位置上,這與一般函式不同,主函式在呼叫一般函式的時候,是指令跳轉到被呼叫函式的入口位址,執行完被呼叫函式後,指令再跳轉回主函式上繼續執行後面的**;而由於內聯函式是將函式的**直接放在了函式的位置上,所以沒有指令跳轉,指令按順序執行

3)一般函式的**段只有乙份,放在記憶體中的某個位置上,當程式呼叫它是,指令就跳轉過來;當下一次程式呼叫它是,指令又跳轉過來;而內聯函式是程式中呼叫幾次內聯函式,內聯函式的**就會複製幾份放在對應的位置上

4)內聯函式一般在標頭檔案中定義,而一般函式在標頭檔案中宣告,在cpp中定義

5)內聯函式是非強制性的,編譯器擁有對標記為inline函式生成函式體的自由,也有對不標記為inline的函式使用內聯替換的自由

6)在inline函式中,區域性static物件在不同cpp檔案中訪問時共享

4.什麼時候使用內聯函式

1)函式本身內容比較少,**比較短,函式功能相對簡單

2)函式被呼叫得頻繁,不如迴圈中的函式

5.什麼時候不能使用內聯函式

1)函式**量多,功能複雜,體積龐大。對於這種函式,就算加上inline修飾符,系統也不一定會相應,可能還是會當成一般函式處理

2)遞迴函式不能使用內聯函式

6.內聯函式比巨集更強大

#include

using namespace std;

#define sum(x) x*x

inline int fun(int x)

int main()

執行結果:11

25為什麼通過巨集執行的結果是11呢,巨集比較機械和簡單,只是將傳入的引數直接放上去就執行,所以int a = sum(2 + 3);就相當於int a = 2 + 3 * 2 +3;由於乘法優先順序更高,所以得到a的值為11;而在內聯函式中,傳入的引數是5,所以得到25

為了得到正確的結果,我們應該將巨集改變為:

#define sum(x) ((x)*(x))

7.類與內聯函式

1)類內定義的函式都是內聯函式,不管是否有inline修飾符

2)函式宣告在類內,但定義在類外的看是否有inline修飾符,如果有就是內聯函式,否則不是

inline 內聯函式

一 inline關鍵字用來定義乙個類的內聯函式,引入它的主要原因是用它替代c中表示式形式的巨集定義。表示式形式的巨集定義一例 define expressionname var1,var2 var1 var2 var1 var2 為什麼要取代這種形式呢,且聽我道來 1 首先談一下在c中使用這種形式巨...

inline內聯函式

技術類筆試題50 都會問巨集與inline的區別,自己去找找看?1 巨集替換發生在預編譯 2 巨集函式 如果可以這麼叫的話 替換時不會檢查引數,inline函式會檢查 3 巨集一定會發生替換,inline貌似不是強制的,編譯器想不替換也沒關係 4 巨集替換時存在著一些不可避免的陷阱 參見c trap...

inline內聯函式

一 內聯函式 內聯函式是指用inline關鍵字修飾的函式 它與普通函式所不同之處只在於函式呼叫的處理。普通 函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中 內聯函式不是在呼叫時發生執行權轉移,而是在編譯時將 函式 體 嵌入在每乙個呼叫處。編譯時類似巨集替換,使用 函式體替...