在函式宣告或定義中函式返回型別前加上關鍵字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修飾符,表示為內聯函式,棧空間就是指放置程式的區域性資料 也就是函式內資料 的記憶體空間。在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足而導致程式出錯的問題,如,函式的死迴圈遞迴呼叫...