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