inline用法詳解

2021-10-09 09:02:14 字數 2873 閱讀 6611

在函式宣告或定義中函式返回型別前加上關鍵字inline即把min()指定為內聯。

inline

intmin

(int first,

int secend)

;

inline是c++關鍵字,在函式宣告或定義中,函式返回型別前加上關鍵字inline,即可以把函式指定為內聯函式。這樣可以解決一些頻繁呼叫的函式大量消耗棧空間(棧記憶體)的問題。關鍵字inline必須與函式定義放在一起才能使函式成為內聯函式,僅僅將inline放在函式宣告前面不起任何作用。inline是一種「用於實現」的關鍵字,而不是一種「用於宣告」的關鍵字。

inline關鍵字用來定義乙個類的內聯函式,引入它的主要原因是用它替代c中表示式形式的巨集定義。

表示式形式的巨集定義如:

#define expressionname(var1,var2) ((var1)+(var2))*((var1)-(var2))

1.inline定義的類的內聯函式,函式的**被放入符號表中,在使用時直接進行替換(像巨集一樣展開),沒有了呼叫的開銷,效率也很高。

2.很明顯,類的內聯函式也是乙個真正的函式,編譯器在呼叫乙個內聯函式時,會首先檢查它的引數的型別,保證呼叫正確。然後進行一系列的相關檢查,就像對待任何乙個真正的函式一樣。這樣就消除了它的隱患和侷限性。

3.inline可以作為某個類的成員函式,當然就可以在其中使用所在類的保護成員及私有成員。

1.可以使用inline函式完全取代表示式形式的巨集定義。

2.內聯函式一般只會用在函式內容非常簡單的時候。這是因為,內聯函式的**會在任何呼叫它的地方展開,如果函式太複雜,**膨脹帶來的惡果很可能會大於效率的提高帶來的益處。內聯函式最重要的使用地方是用於類的訪問函式。

(1)內聯函式的作用

●對於內聯函式,c++有可能直接用函式體**來替代對函式的呼叫,這一過程稱為函式體的內聯展開。

●對於只有幾條語句的小函式來說,與函式的呼叫、返回有關的準備和收尾工作的**往往比函式體本身的**要大得多。因此,對於這類簡單的、使用頻繁的小函式,將之說明為內聯函式可提高執行效率。

(2)慎用內聯函式

內聯是以**膨脹複製為代價,僅僅省去了函式呼叫的開銷,從而提高函式的執行效率。如果執行函式體內**的時間,相比於函式呼叫的開銷較大,那麼效率的收穫會很少。另一方面,每一處內聯函式的呼叫都要複製**, 將使程式的總**量增大,消耗更多的記憶體空間。

以下情況不宜使用內聯:

1)如果函式體內的**比較長,使用內聯將導致記憶體消耗代價較高。

2)如果函式體內出現迴圈,那麼執行函式體內**的時間要比函式呼叫的開銷大。

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

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

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

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

1.在類中定義這種函式:

class classname; // 如果在類中直接定義,不需要用inline修飾,編譯器自動化為內聯函式

2.在類外定義前加inline關鍵字:

class

account

//與1相同

double

getbalance()

;//在類中宣告

double

deposit

(double amount )

;double

withdraw

(double amount )

;private

:double balance;};

inline

double account::

getbalance()

//在類外定義時新增inline關鍵字

inline

double account::

deposit

(double amount )

inline

double account::

withdraw

(double amount )

此外還有一些規則需注意:

1.inline說明對編譯器來說只是一種建議,編譯器可以選擇忽略這個建議。比如,若是將乙個長達1000多行的函式指定為inline,編譯器就會忽略這個inline,將這個函式還原成普通函式。

2.在呼叫內聯函式時,要保證內聯函式的定義讓編譯器"看"到,也就是說內聯函式的定義要在標頭檔案中,這與通常的函式定義不一樣。但如果習慣將函式定義放在cpp檔案中,或者想讓標頭檔案更簡潔一點,可這樣做:

#ifndef someinline_h

#define someinline_h

type example

(void);

//........其他函式的宣告

#include

"someinlie.cpp"

//原始檔字尾名隨編譯器而定

#endif

中#include

"someinline.h"

inline type example

(void

)//...............其他函式的定義

以上方法是通用、有效的,可放心使用,不必擔心在標頭檔案包含cpp檔案會導致編譯錯誤。

詳解C 中的inline用法

1.引入inline關鍵字的原因 在c c 中,為了解決一些頻繁呼叫的小函式大量消耗棧空間 棧記憶體 的問題,特別的引入了inline修飾符,表示為內聯函式。棧空間就是指放置程式的區域性資料 也就是函式內資料 的記憶體空間。在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足而導致程式出...

inline關鍵字的用法詳解

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

C 中inline用法案例詳解

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