1.內(nèi)聯(lián)函數(shù)可減少cpu的系統(tǒng)開銷,并且程序的整體速度將加快,但當(dāng)內(nèi)聯(lián)函數(shù)很大時,會有相反的作用,因此一般比較小的函數(shù)才使用內(nèi)聯(lián)函數(shù).
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了向陽免費建站歡迎大家使用!
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í)行速度而已。
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++)。
在c++中內(nèi)聯(lián)函數(shù)是對宏定義一種改造,因為利用內(nèi)聯(lián)函數(shù)取代宏定義得好處是:
1、可進(jìn)行類型安全檢查或自動類型轉(zhuǎn)換、
例如:在c語言中,常用預(yù)處理器語句#define來代替一個函數(shù)定義。例如:
#define MAX(a,b) ((a)(b)? (a):(b))
該語句是在程序中每個出現(xiàn)Max(a,b)函數(shù)調(diào)用得地方,都被后面得表達(dá)式((a)(b)?(a):(b))所替代
不難發(fā)現(xiàn)其實對參數(shù)a,b來說都沒有數(shù)據(jù)類型得定義,缺少一些安全性檢查。
2、提高程序的運行效率
對于c++中一般得函數(shù),被程序調(diào)用得時都需要為該函數(shù)開辟空間進(jìn)行函數(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ù)是編譯器在便宜階段進(jìn)行函數(shù)體展開的,所以,這就把類的內(nèi)聯(lián)函數(shù)的定義與實現(xiàn)都必須在
聲明類的那個頭文件中,而不能放在實現(xiàn)類的那個cpp文件中;這一點與模板template的特性相似
當(dāng)前名稱:c語言內(nèi)聯(lián)函數(shù)的聲明 c++內(nèi)聯(lián)函數(shù)定義
文章位置:http://www.chinadenli.net/article8/dosiiop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、云服務(wù)器、網(wǎng)站策劃、網(wǎng)站維護(hù)、、品牌網(wǎng)站建設(shè)
聲明:本網(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)