2008-08-27 22:33:06
| 分類:
c/vc/c++|舉報
|字型大小訂閱
巨集:就是使用乙個字串來代替乙個表示式**或函式呼叫**;編譯之前,預處理器會使用這個巨集字串所代表的表示式**或函式呼叫**來替換所有出現的巨集字串,這樣的話,用巨集表示的函式呼叫**就不用另外開闢函式棧,不用保護和恢復函式呼叫現場,這樣就提高了**的執行效率;所以,呼叫乙個巨集比呼叫乙個函式更有效;
但是呼叫巨集的時候,有乙個缺點:由於巨集在預處理時使用的是巨集字串替換,所以,編譯器在編譯的時候不知道巨集所代表的**的語法,不知道巨集所代表的**的資料型別,沒有安全檢查;如果出現的類裡面,巨集不能訪問類的私有成員,而且容易產生二意性;所以,巨集也有自己不能解決的、不可避免的問題;
解決巨集定義函式所帶來的問題的辦法,就是使用內聯函式;可以使用內聯函式來代替巨集定義;
內聯函式與巨集的區別在於:巨集是由預處理器來對巨集進行替代,沒有語法檢查、型別檢查和安全檢查;內聯函式是通過編譯器的控制來實現的,有語法檢查、型別檢查和安全檢查;內聯函式是真正的函式,而且在呼叫的地方,由編譯器負責把內聯函式的函式體**塊替換到內聯函式被呼叫的地方,這一點與巨集替換很相似;內聯函式有引數,有返回值;由於內聯函式可以像巨集一樣被展開,所以呼叫內聯函式的時候,取消了函式引數壓棧、出棧所帶來的開銷,從而減少了函式呼叫開銷;這就是內聯函式的優越於巨集的地方;
內聯函式的宣告和內聯函式的函式體的定義必須在一起;下面宣告內聯函式的語句是無效的:
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<>的特性相似;
C 內聯函式
1 什麼是內聯函式?內聯函式就是小型函式,犧牲空間來節省函式呼叫的開銷,一般用作比較小的函式,即函式內部沒有迴圈 開關語句等。內聯函式被發明出來就是為了取代c中的巨集,因為巨集是單純的替換而沒有型別檢查所以經常出毛病,2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率...
C 內聯函式
1 什麼是內聯函式?2 為什麼要引入內聯函式?3 為什麼inline能取代巨集?4 內聯函式和巨集的區別?5 什麼時候用內聯函式?6 如何使用內聯函式?7 內聯函式的優缺點?8 如何禁止函式進行內聯?9 注意事項 1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內...
c 內聯函式
1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內。2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率問題。另外,前面我們講到了巨集,裡面有這麼乙個例子 define abs x x 0?x x 當 i出現時,巨集就會歪曲我們的意思...