【轉】#define 和內聯函數

技術 2009-10-18 14:35:54 閱讀101 評論0 字號:大中小 訂閱 內聯函數的功能和預處理宏的功能相似。 宏在C中是經常用的,爲什麼要使用宏呢?因爲函數的調用必須要將程序執行的順序轉移到函數 所存放在內存中的某個地址,將函數的程序內容執行完後,再返回到轉去執行該函數前的地方。這種轉移操作要求在轉去執行前要保存現場並記憶執行的地址,轉回後要恢復現場,並按原來保存地址繼續執行。因此,函數調用要有一定的時間和空間方面的開銷,於是將影響其效率。而宏只是在預處理的地方把代碼展開,不需要額外的空間和時間方面的開銷,所以調用一個宏比調用一個函數更有效率。   但是宏也有很多的不盡人意的地方。   1、.宏不能訪問對象的私有成員。   2、.宏的定義很容易產生二意性。 現在有了C++,我們可以使用內聯函數 來取代宏的定義。而且事實上我們可以用內聯函數完全取代預處理宏。內聯函數和宏的區別在於,宏是由預處理器對宏進行替代,而內聯函數是 通過編譯器控制來實現的。而且內聯函數是真正的函數,只是在需要用到的時候,內聯函數像宏一樣的展開,所以取消了函數的參數壓棧,減少了調用的開銷。你可以象調用函數一樣來調用內聯函數,而不必擔心會產生於處理宏的一些問題。 內聯函數在C++類中,應用最廣的,應該是用來定義存取函數。我們定義的 類中一般會把數據成員定義成私有的或者保護的,這樣,外界就不能直接讀寫我們類成員的數據了。 對於私有或者保護成員的讀寫就必須使用成員接口函數來進行。如果我們把這些讀寫成員函數定義成內聯函數的話,將會獲得比較好的效率。 Class sample{  Private:   Int nTest;  Public:   Int readtest(){ return nTest;}  Void settest(int I) {nTest=I;} }   當然,內聯函數也有一定的侷限性。就是函數中的執行代碼不能太多了,如果,內聯函數的函數體過大,一般的編譯器會放棄內聯方式,而採用普通的方式調用函數。這樣,內聯函數就和普通函數執行效率一樣了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章