1.
宏作的是簡單的字符串替換
(
注意是字符串的替換
,
不是其餘類型參數的替換
),
而函數的參數的傳遞
,
參數是有數據類型的
,
能夠是各類各樣的類型
.
2.
宏的參數替換是不經計算而直接處理的
,
而函數調用是將實參的值傳遞給形參
,
既然說是值
,
天然是計算得來的
.
3.
宏在編譯以前進行
,
即先用宏體替換宏名
,
而後再編譯的
,
而函數顯然是編譯以後
,
在執行時
,
才調用的
.
所以
,
宏佔用的是編譯的時間
,
而函數佔用的是執行時的時間
.
4.
宏的參數是不佔內存空間的
,
由於只是作字符串的替換
,
而函數調用時的參數傳遞則是具體變量之間的信息傳遞
,
形參做爲函數的局部變量
,
顯然是佔用內存的
.
5.
函數的調用是須要付出必定的時空開銷的
,
由於系統在調用函數時
,
要保留現場
,
而後轉入被調用函數去執行
,
調用完
,
再返回主調函數
,
此時再恢復現場
,
這些操做
,
顯然在宏中是沒有的
.
如今來看內聯函數
:
所謂
"
內聯函數
"
就是將很簡單的函數
"
內嵌
"
到調用他的程序代碼中
,
只樣作的目的是爲了不上面說到的第
5
點
,
目的旨在節約下本來函數調用時的時空開銷
.
但必須注意的是
:
做爲內聯函數
,
函數體必須十分簡單
,
不能含有循環、條件、選擇等複雜的結構,不然就不能作爲內聯函數了。事實上,即使你沒有指定函數爲內聯函數,有的編譯系統也會自動將很簡單的函數做爲內聯函數處理;而對於複雜的函數,即使你指定他爲內聯函數,系統也不會理會的。