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