深度解析內聯函式

2021-10-05 19:16:52 字數 1164 閱讀 6829

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

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

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

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

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

利:避免了指令的來回跳轉,加快程式執行速度

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

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

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

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

看一段**:

#include

using

namespace std;

#define sum(x) x*x

inline

intfun

(int x)

intmain()

執行結果:

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

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

#define sum(x) ((x)*(x))
1)類內定義的函式都是內聯函式,不管是否有inline修飾符

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

inline內聯函式之深度解析

介紹內聯函式之前,有必要介紹一下預處理巨集。內聯函式的功能和預處理巨集的功能相似。相信大家都用過預處理巨集,我們會經常定義一些巨集,如 define table comp x x 0?x 0 就定義了乙個巨集。為什麼要使用巨集呢?因為函式的呼叫必須要將程式執行的順序轉移到函式所存放在記憶體中的某個位...

解析巨集函式與內聯函式

一 巨集函式的優點 不會進行傳參 入棧 出棧,以及函式呼叫時的跳轉,因此執行速度比正常函式要快 二 巨集函式的缺點 不檢查資料型別,沒有返回值,僅有乙個執行結果,每使用一次就會把表達展開一次,會造成 段的冗餘,導致可執行檔案變大,而且巨集函式容易出現二義性 會根據引數的不同 環境不同發生變化 三 內...

ftok 函式深度解析

關於ftok函式,先不去了解它的作用來先說說為什麼要用它,共享記憶體,訊息佇列,訊號量它們三個都是找乙個中間介質,來進行通訊的,這種介質多的是。就是怎麼區分出來,就像唯一乙個身份證來區分人一樣。你隨便來乙個就行,就是因為這。只要唯一就行,就想起來了檔案的裝置編號和節點,它是唯一的,但是直接用它來作識...