1.內(nèi)聯(lián)函數(shù)可減少cpu的系統(tǒng)開銷,并且程序的整體速度將加快,但當(dāng)內(nèi)聯(lián)函數(shù)很大時,會有相反的作用,因此一般比較小的函數(shù)才使用內(nèi)聯(lián)函數(shù).
我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、泰安ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的泰安網(wǎng)站制作公司
2.有兩種內(nèi)聯(lián)函數(shù)的聲明方法,一種是在函數(shù)前使用inline關(guān)見字,另一種是在類的內(nèi)部定義函數(shù)的代碼,這樣的函數(shù)將自動轉(zhuǎn)換為內(nèi)聯(lián)函數(shù),而且沒必要將inline放在函數(shù)前面.
3.內(nèi)聯(lián)是一種對編譯器的請求,下面這些情況會阻止編譯器服從這項請求.
如果函數(shù)中包含有循環(huán),switch或goto語句,遞歸函數(shù),含有static的函數(shù).
由此可以看出,內(nèi)聯(lián)函數(shù)和成員函數(shù)沒什么區(qū)別,區(qū)別就在于怎樣加快函數(shù)的執(zhí)行速度而已。
應(yīng)該是c++中才有的, inline 關(guān)鍵字用來定義一個類的內(nèi)聯(lián)函數(shù),引入它的主要原因是用它替代C中表達式形式的宏定義。 表達式形式的宏定義一例: #define ExpressionName(Var1,Var2) (Var1+Var2)*(Var1-Var2) 2.這種宏定義在形式上類似于一個函數(shù),但在使用它時,僅僅只是做預(yù)處理器符號表中的簡單替換,因此它不能進行參數(shù)有效性的檢測,也就不能享受C++編譯器嚴(yán)格類型檢查的好處,另外它的返回值也不能被強制轉(zhuǎn)換為可轉(zhuǎn)換的合適的類型,這樣,它的使用就存在著一系列的隱患和局限性。 3.在C++中引入了類及類的訪問控制,這樣,如果一個操作或者說一個表達式涉及到類的保護成員或私有成員,你就不可能使用這種宏定義來實現(xiàn)(因為無法將this指針放在合適的位置)。 4. inline 推出的目的,也正是為了取代這種表達式形式的宏定義,它消除了它的缺點,同時又很好地繼承了它的優(yōu)點。 對應(yīng)于上面的1-3點,闡述如下: 1. inline 定義的類的內(nèi)聯(lián)函數(shù),函數(shù)的代碼被放入符號表中,在使用時直接進行替換,(像宏一樣展開),沒有了調(diào)用的開銷,效率也很高。 2.很明顯,類的內(nèi)聯(lián)函數(shù)也是一個真正的函數(shù),編譯器在調(diào)用一個內(nèi)聯(lián)函數(shù)時,會首先檢查它的參數(shù)的類型,保證調(diào)用正確。然后進行一系列的相關(guān)檢查,就像對待任何一個真正的函數(shù)一樣。這樣就消除了它的隱患和局限性。 3. inline 可以作為某個類的成員函數(shù),當(dāng)然就可以在其中使用所在類的保護成員及私有成員。 在何時使用inline函數(shù): 首先,你可以使用inline函數(shù)完全取代表達式形式的宏定義。
在c++中內(nèi)聯(lián)函數(shù)是對宏定義一種改造,因為利用內(nèi)聯(lián)函數(shù)取代宏定義得好處是:
1、可進行類型安全檢查或自動類型轉(zhuǎn)換、
例如:在c語言中,常用預(yù)處理器語句#define來代替一個函數(shù)定義。例如:
#define MAX(a,b) ((a)(b)? (a):(b))
該語句是在程序中每個出現(xiàn)Max(a,b)函數(shù)調(diào)用得地方,都被后面得表達式((a)(b)?(a):(b))所替代
不難發(fā)現(xiàn)其實對參數(shù)a,b來說都沒有數(shù)據(jù)類型得定義,缺少一些安全性檢查。
2、提高程序的運行效率
對于c++中一般得函數(shù),被程序調(diào)用得時都需要為該函數(shù)開辟空間進行函數(shù)得壓棧、出棧等所帶來得開銷,而
內(nèi)聯(lián)函數(shù)像宏一樣被展開,調(diào)用內(nèi)聯(lián)函數(shù)的時候,由編譯器負(fù)責(zé)把內(nèi)聯(lián)函數(shù)的函數(shù)體代碼塊替換到內(nèi)聯(lián)函數(shù)被調(diào)用的
地方,這一點與宏替換很相似;取消了函數(shù)參數(shù)壓棧、出棧所帶來的開銷,從而減少了函數(shù)調(diào)用開銷,提高程序得運
行效率。
所以,內(nèi)聯(lián)函數(shù)在項目開發(fā)中經(jīng)常用到,所以關(guān)于內(nèi)聯(lián)函數(shù)得使用應(yīng)用如下:
第一種 、內(nèi)聯(lián)函數(shù)得聲明和函數(shù)體得定義在一起
例如:
inline int Max(int a, int b){return ((a b) ? a : b)};
第二種、c++類得成員函數(shù)也可以被定義為內(nèi)聯(lián)函數(shù)
class Student{
private:
int nID;
int nAge;
float fScore;
public:
void setID(int nid){ nID = nid; } //該成員函數(shù)默認(rèn)自動為內(nèi)聯(lián)函數(shù)(隱式定義內(nèi)聯(lián)函數(shù))
int getID(void){ return nID; } //該成員函數(shù)默認(rèn)自動為內(nèi)聯(lián)函數(shù)(隱式定義內(nèi)聯(lián)函數(shù))
inline void setAge(int nage) { nAge = nage; } //顯式定義內(nèi)聯(lián)函數(shù)
inline int getAge(void) { return nAge; } //顯式定義內(nèi)聯(lián)函數(shù)
void setScore(float fscore); //類定義體內(nèi)沒有聲明為內(nèi)聯(lián)函數(shù);
float getScore(void); //類定義體內(nèi)沒有聲明為內(nèi)聯(lián)函數(shù);
}
inline void Student::setScore(float fscore){ fScore = fscore; } //類定義體外實現(xiàn)為內(nèi)聯(lián)函數(shù);
inline float Student::getScore(void) { return fScore; } //類定義體外實現(xiàn)為內(nèi)聯(lián)函數(shù);
注意:(1)C++中,在類定義體內(nèi)部定義了函數(shù)體的成員函數(shù),被編譯器默認(rèn)為內(nèi)聯(lián)函數(shù),而不管這個函數(shù)頭前面是
否有關(guān)鍵字inline,比如:setID()、getID()、setAge()、getAge();
(2)以把實現(xiàn)在類定義體外部的成員函數(shù)定義為內(nèi)聯(lián)函數(shù),這個時候在類定義體中只有成員函數(shù)頭的聲明,而
其實現(xiàn)是在類定義體外部,比如:setScore()和getScore();
內(nèi)聯(lián)函數(shù)的局限性:
1、由于內(nèi)聯(lián)函數(shù)與宏一樣也是實現(xiàn)為代碼替換,所以定義為內(nèi)聯(lián)函數(shù)的函數(shù)體不宜過大,如果函數(shù)體過
大,則某些普通的編譯器就會放棄內(nèi)聯(lián)方式,而改用調(diào)用普通函數(shù)的方式,這樣就失去了內(nèi)聯(lián)函數(shù)的意義了;所以,
內(nèi)聯(lián)函數(shù)的函數(shù)體代碼不宜過大,一般就是3---4行代碼即可;
2、由于內(nèi)聯(lián)函數(shù)是編譯器在便宜階段進行函數(shù)體展開的,所以,這就把類的內(nèi)聯(lián)函數(shù)的定義與實現(xiàn)都必須在
聲明類的那個頭文件中,而不能放在實現(xiàn)類的那個cpp文件中;這一點與模板template的特性相似
C語言本身是不支持內(nèi)聯(lián)函數(shù)的,在最新的C標(biāo)準(zhǔn)C99中C語言支持了內(nèi)聯(lián)函數(shù)。
C++支持內(nèi)聯(lián)函數(shù)。
從編譯器的角度:
有些C語言編譯器,例如GNU C提供了內(nèi)聯(lián)函數(shù)的支持。
所有C++編譯器都支持內(nèi)聯(lián)函數(shù)。
如果你的C語言編譯器不支持內(nèi)聯(lián)函數(shù),看看它有多古老,太古老不行(例如 Turbo C 2.0)。如果是C/C++合體編譯器,那就切換到編譯C++模式(例如VisualC++)。
其實看你用得編譯器了,如果你用的VC++6.0的話, 不管是.C文件還是.CPP文件都可以用inline 定義內(nèi)聯(lián)函數(shù)。但是語法來說,C語言是沒有內(nèi)聯(lián)這個概念的,C++才有
網(wǎng)頁題目:c語言內(nèi)聯(lián)函數(shù)怎么定義 c語言內(nèi)聯(lián)函數(shù)怎么定義的
文章位置:http://chinadenli.net/article16/dodeidg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、App設(shè)計、云服務(wù)器、App開發(fā)、品牌網(wǎng)站設(shè)計、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)