c语言inline不起作用,C语言inline内联函数学习小结
//inline(內聯(lián))函數:將普通的函數定義為inline函數,可以避免普通函數入棧出棧的開銷,它是將函數內的代碼直接粘貼到調用處。除此之外,它和普通函數無異。
//要成為inline函數必須具備以下幾點:
//1、函數代碼很短,通過不超過10行
//2、函數內不能出現循環(huán)、遞歸、switch...case
//3、需要在編譯的時候開啟優(yōu)化選項-O
//否則加上inline修飾,編譯器也會視而不見
//強制inline宏
#define?__inline__attribute__((always_inline))
//inline放置的位置只要在函數的返回值的類型前面就可,如果函數又有static修飾,放在static的前后都可
//inline在不同編譯器下放置的位置導致的結果是不同的,某些編譯器如果將inline放在函數的聲明的前面是不被視為inline函數的,但大部分編譯器對放在函數聲明和函數定義的前面視為一樣
內聯(lián)函數與宏的區(qū)別在于:宏是由預處理器來對宏進行替代,沒有語法檢查、類型檢查和安全檢查;內聯(lián)函數是通過編譯器的控制來實現的,有語法檢查、類型檢查和安全檢查;內聯(lián)函數是真正的函數,而且在調用的地方,由編譯器負責把內聯(lián)函數的函數體代碼塊替換到內聯(lián)函數被調用的地方,這一點與宏替換很相似;內聯(lián)函數有參數,有返回值;由于內聯(lián)函數可以像宏一樣被展開,所以調用內聯(lián)函數的時候,取消了函數參數壓棧、出棧所帶來的開銷,從而減少了函數調用開銷;這就是內聯(lián)函數的優(yōu)越于宏的地方;
內聯(lián)函數的聲明和內聯(lián)函數的函數體的定義必須在一起;下面聲明內聯(lián)函數的語句是無效的:inline?int?Max(int?a,?int?b);
而下面的內聯(lián)函數的定義是有效的:
inline?int?Max(int?a,?int?b){return?((a?>?b)???a?:?b)};(c?語言聲明)
C++類的成員函數也可以被定義為內聯(lián)函數;比如:
class?Student
{
private:
int?nID
int?nAge;
float?fScore;
public:
void?setID(int?nid){?nID?=?nid;?}?//該成員函數默認自動為內聯(lián)函數(隱式定義內聯(lián)函數)
int?getID(void){?return?nID;?}?//該成員函數默認自動為內聯(lián)函數(隱式定義內聯(lián)函數)
inline?void?setAge(int?nage)?{?nAge?=?nage;?}?//顯式定義內聯(lián)函數
inline?int?getAge(void)?{?return?nAge;?}?//顯式定義內聯(lián)函數
void?setScore(float?fscore);?//類定義體內沒有聲明為內聯(lián)函數;
float?getScore(void);?//類定義體內沒有聲明為內聯(lián)函數;
}
inline?void?Student::setScore(float?fscore){?fScore?=?fscore;?}?//類定義體外實現為內聯(lián)函數;
inline?float?Student::getScore(void)?{?return?fScore;?}?//類定義體外實現為內聯(lián)函數;
C++中,在類定義體內部定義了函數體的成員函數,被編譯器默認為內聯(lián)函數,而不管這個函數頭前面是否有關鍵字inline,比如:setID()、getID()、setAge()、getAge();也可以把實現在類定義體外部的成員函數定義為內聯(lián)函數,這個時候在類定義體中只有成員函數頭的聲明,而其實現是在類定義體外部,比如:setScore()和getScore();
即便是可以把實現在類定義體外部的成員函數定義為內聯(lián)函數,那該成員函數的實現也必須寫在聲明類定義體的哪個頭文件(.h)中,不能違反規(guī)則;即:內聯(lián)函數的定義和實現都必須在同一個頭(.h)文件中;
內聯(lián)函數的局限性:
1、由于內聯(lián)函數與宏一樣也是實現為代碼替換,所以定義為內聯(lián)函數的函數體不宜過大,如果函數體過大,則某些普通的編譯器就會放棄內聯(lián)方式,而改用調用普通函數的方式,這樣就失去了內聯(lián)函數的意義了;所以,內聯(lián)函數的函數體代碼不宜過大,一般就是3---4行代碼即可;
2、由于內聯(lián)函數是編譯器在便宜階段進行函數體展開的,所以,這就把類的內聯(lián)函數的定義與實現都必須在聲明類的那個頭文件中,而不能放在實現類的那個cpp文件中;
總結
以上是生活随笔為你收集整理的c语言inline不起作用,C语言inline内联函数学习小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光大旅游主题卡怎么申请?需要什么条件
- 下一篇: 证券公司理财产品安全吗?证券公司理财产品