C 內聯函式 inline

2021-07-13 03:47:39 字數 1870 閱讀 1163

**:

巨集:就是使用乙個字串來代替乙個表示式**或函式呼叫**;編譯之前,預處理器會使用這個巨集字串所代表的表示式**或函式呼叫**來替換所有出現的巨集字串,這樣的話,用巨集表示的函式呼叫**就不用另外開闢函式棧,不用保護和恢復函式呼叫現場,這樣就提高了**的執行效率;所以,呼叫乙個巨集比呼叫乙個函式更有效;

但是呼叫巨集的時候,有乙個缺點:由於巨集在預處理時使用的是巨集字串替換,所以,編譯器在編譯的時候不知道巨集所代表的**的語法,不知道巨集所代表的**的資料型別,沒有安全檢查;如果出現的類裡面,巨集不能訪問類的私有成員,而且容易產生二意性;所以,巨集也有自己不能解決的、不可避免的問題;

解決巨集定義函式所帶來的問題的辦法,就是使用內聯函式;可以使用內聯函式來代替巨集定義;

內聯函式與巨集的區別在於:巨集是由預處理器來對巨集進行替代,沒有語法檢查、型別檢查和安全檢查;內聯函式是通過編譯器的控制來實現的,有語法檢查、型別檢查和安全檢查;內聯函式是真正的函式,而且在呼叫的地方,由編譯器負責把內聯函式的函式體**塊替換到內聯函式被呼叫的地方,這一點與巨集替換很相似;內聯函式有引數,有返回值;由於內聯函式可以像巨集一樣被展開,所以呼叫內聯函式的時候,取消了函式引數壓棧、出棧所帶來的開銷,從而減少了函式呼叫開銷;這就是內聯函式的優越於巨集的地方;

內聯函式的宣告和內聯函式的函式體的定義必須在一起;下面宣告內聯函式的語句是無效的:

inline int max(int a, int b);

而下面的內聯函式的定義是有效的:

inline int max(int a, int b);

c++類的成員函式也可以被定義為內聯函式;比如:

class student

//該成員函式預設自動為內聯函式(隱式定義內聯函式)

int getid(void)       //該成員函式預設自動為內聯函式(隱式定義內聯函式)

inline void setage(int nage)    //顯式定義內聯函式

inline int getage(void)         //顯式定義內聯函式

void setscore(float fscore);         //類定義體內沒有宣告為內聯函式;

float getscore(void);                //類定義體內沒有宣告為內聯函式;

}inline void student::setscore(float fscore) //類定義體外實現為內聯函式;

inline float student::getscore(void)          //類定義體外實現為內聯函式;

c++中,在類定義體內部定義了函式體的成員函式,被編譯器預設為內聯函式,而不管這個函式頭前面是否有關鍵字inline,比如:setid()、getid()、setage()、getage();也可以把實現在類定義體外部的成員函式定義為內聯函式,這個時候在類定義體中只有成員函式頭的宣告,而其實現是在類定義體外部,比如:setscore()和getscore();

即便是可以把實現在類定義體外部的成員函式定義為內聯函式,那該成員函式的實現也必須寫在宣告類定義體的哪個標頭檔案(.h)中,不能違反規則;即:內聯函式的定義和實現都必須在同乙個頭(.h)檔案中;

內聯函式的侷限性:

1、由於內聯函式與巨集一樣也是實現為**替換,所以定義為內聯函式的函式體不宜過大,如果函式體過大,則某些普通的編譯器就會放棄內聯方式,而改用呼叫普通函式的方式,這樣就失去了內聯函式的意義了;所以,內聯函式的函式體**不宜過大,一般就是3---4行**即可;

2、由於內聯函式是編譯器在便宜階段進行函式體展開的,所以,這就把類的內聯函式的定義與實現都必須在宣告類的那個標頭檔案中,而不能放在實現類的那個cpp檔案中;這一點與模板template<>的特性相似;

inline函式 C 內聯函式 inline

inline要起作用,必須要與函式定義放在一起,而不是函式的宣告 inline 當編譯器處理呼叫內聯函式的語句時,不會將該語句編譯成函式呼叫的指令,而是直接將整個函式體的 插人呼叫語句處,就像整個函式體在呼叫處被重寫了一遍一樣,在執行時是順序執行,而不會進行跳轉。優點 內聯函式沒有執行函式呼叫的開銷...

c 內聯函式inline

1.inline原理 在程式編譯時,編譯器將程式中出現的內聯函式的呼叫表示式用內聯函式的函式體來進行替代。採用空間換時間的策略。是以 膨脹 複製 為代價,僅僅省去了函式呼叫的開銷,從而提高函式的執行效率。例如 如果乙個函式被指定為inline函式,則它將在程式中每個呼叫點上被展開。int i 10 ...

C 內聯inline函式

內聯inline函式 在c中保持效率的一種方法是使用巨集,他的行為類似於函式呼叫但卻沒有呼叫的開銷 like a function call without the normal function call overhead.巨集是由由預處理器preprocessor而非編譯器compiler處理的...