呼叫函式時需要一定的時間和空間的開銷。
c++提供一種提高效率的方法,即在編譯時將所呼叫函式的**直接嵌入到主調函式中,而不是將流程轉出去。這種嵌入到主調函式中的函式稱為
內建函式(inline function)
,又稱內嵌函式
。在有些書中把它譯成
內聯函式
。指定內建函式的方法很簡單,只需在函式首行的左端加乙個關鍵字inline即可。
【例4.4】函式指定為內建函式。
#include
using
namespace std;
inline
intmax
(int
,int
,int
);//宣告函式, 注意左端有inline
intmain()
inline
intmax
(int a,
int b,
int c)
//定義max為內建函式
由於在定義函式時指定它為內建函式,因此編譯系統在遇到函式呼叫「max(i, j, k)」時,就用max函式體的**代替「max(i,j, k)」,同時將實參代替形參。這樣,程式第6行 「m=max(i, j, k);」就被置換成
if (j>i) i=j;
if(k>i) i=k;
m=i;
注意:可以在宣告函式和定義函式時同時寫inline,也可以只在其中一處宣告inline,效果相同,都能按內建函式處理。
使用內建函式可以節省執行時間,但卻增加了目標程式的長度。因此一般只將規模很小(一般為5個語句以下)而使用頻繁的函式(如定時採集資料的函式)宣告為內建函式。
內建函式中不能包括複雜的控制語句,如迴圈語句和switch語句。
應當說明:對函式作inline宣告,只是程式設計者對編譯系統提出的乙個建議,也就是說它是建議性的,而不是指令性的。並非一經指定為inline,編譯系統就必須這樣做。編譯系統會根據具體情況決定是否這樣做。
歸納起來,只有那些規模較小而又被頻繁呼叫的簡單函式,才適合於宣告為inline函式。
類的成員函式也可以指定為內建函式。
在類體中定義的成員函式的規模一般都很小,而系統呼叫函式的過程所花費的時間開銷相對是比較大的。呼叫乙個函式的時間開銷遠遠大於小規模函式體中全部語句的執行時間。為了減少時間開銷,如果在類體中定義的成員函式中不包括迴圈等控制結構,c++系統會自動將它們作為內建(inline)函式來處理。
也就是說,在程式呼叫這些成員函式時,並不是真正地執行函式的呼叫過程(如保留返回位址等處理),而是把函式**嵌入程式的呼叫點。這樣可以大大減少呼叫成員函式的時間開銷。c++要求對一般的內建函式要用關鍵字inline宣告,但對類內定義的成員函式,可以省略inline,因為這些成員函式已被隱含地指定為內建函式。如:
class
student
private
:int num;
string
name;
char ***;};
其中第3行
void display( )
也可以寫成
inline void display( )
將display函式顯式地宣告為內建函式。
以上兩種寫法是等效的。對在類體內定義的函式,一般都省寫inline。
應該注意的是,如果成員函式不在類體內定義,而在類體外定義,系統並不把它預設為內建(inline )函式,呼叫這些成員函式的過程和呼叫一般函式的過程是相同的。如果想將這些成員函式指定為內建函式,應當用inline作顯式宣告。
如:
class
student
;inline
void student::
display()
// 在類外定義display函式為內建函式
在前面曾提到過,在函式的宣告或函式的定義兩者之一作inline宣告即可。
值得注意的是,如果在類體外定義inline函式,則必須將類定義和成員函式的定義都放在同乙個標頭檔案中(或者寫在同乙個原始檔中),否則編譯時無法進行置換(將函式**的拷貝嵌入到函式呼叫點)。
但是這樣做,不利於類的介面與類的實現分離,不利於資訊隱蔽。雖然程式的執行效率提高了,但從軟體工程質量的角度來看,這樣做並不是好的辦法。只有在類外定義的成員函式規模很小而呼叫頻率較高時,才將此成員函式指定為內建函式。
inline成員函式
一 用inline宣告的函式相當 define的作用,即用函式內容內建到程式中,這樣可以減少系統呼叫所花費的時間,特別是對於頻繁呼叫的函式,應該宣告為inline。但函式體太大的話,一般不宣告為inline。二 如果在類體中定義的成員函式,且函式體內沒有迴圈等控制結構,c 系統會自動將它作為inli...
inline成員函式
注意這裡討論的只是類的成員函式。1。在類的宣告裡實現的函式自動為inline。也可以在類申明外定義為inline。但是這一部分必須與類的宣告在同乙個.h檔案裡。如果定義在cpp檔案裡,就會給出編譯錯誤。注 程式設計時,我把函式體實現寫在cpp裡,結果就報錯 error lnk2019 無法解析的外部...
成員函式既是inline又是virtual型別
inline型別表示在編譯時期進行函式展開,用函式體在函式呼叫出代替函式的呼叫 而vitual是c 多型的必要條件,但是要想表現出多型,必須要等到執行時,才知道真正呼叫的是哪乙個函式。表面上看這兩個關鍵字如果同時使用,會產生錯誤,但不會的。先簡單說一下虛表的機制 多型的實現是由虛表加以支援的,凡是有...