宏,咱們有時會定義一些預處理宏,如函數
#define COMP(x) ((x)>0?(x):0) 就定義了一個宏。spa
使用宏的緣由是——函數調用有必定的時間和空間開銷(在函數調用的使用程序跳到函數所在內存中的地址,執行完以後再跳回原來的位置繼續執行。這種轉移須要保存現場並記憶當前內存位置,執行完函數以後再恢復現場),而宏只是在預處理的地方把代碼展開,不須要額外的時間空間開銷,於是提升了效率。.net
內聯函數,使用Inline來定義,在類的內部定義了函數體的函數被默認爲內聯函數。
blog
內聯函數在C++類中,應用最廣的,應該是用來定義存取函數。咱們定義的類中通常會把數據成員定義成私有的或者保護的,這樣,外界就不能直接讀寫咱們類成員的數據了。讀寫就必須使用成員接口函數來進行。若是咱們把這些讀寫成員函數定義成內聯函數的話,將會得到比較好的效率。接口
Class Test{內存
Private:get
Int test;編譯器
Public:編譯
Int getTest(){ return test;}test
Void setTest(int t) {test=t;}
}
內聯函數和宏的區別在於,宏是由預處理器對宏進行替代,而內聯函數是經過編譯器控制來實現的。並且內聯函數是真正的函數,只是在須要用到的時候,內聯函數像宏同樣的展開,因此取消了函數的參數壓棧,減小了調用的開銷。你能夠象調用函數同樣來調用內聯函數,而沒必要擔憂會產生於處理宏的一些問題。
固然,內聯函數也有必定的侷限性。就是函數中的執行代碼不能太多了,若是,內聯函數的函數體過大,通常的編譯器會放棄內聯方式,而採用普通的方式調用函數。這樣,內聯函數就和普通函數執行效率同樣了。
摘抄自http://blog.csdn.net/longjing1113/article/details/8807671