宏、函數、宏函數的區別

 
 
先說 宏和函數的區別

1. 宏作的是簡單的字符串替換 ( 注意是字符串的替換 , 不是其餘類型參數的替換 ), 而函數的參數的傳遞 , 參數是有數據類型的 , 能夠是各類各樣的類型 .
2.
宏的參數替換是不經計算而直接處理的 , 而函數調用是將實參的值傳遞給形參 , 既然說是值 , 天然是計算得來的 .
3.
宏在編譯以前進行 , 即先用宏體替換宏名 , 而後再編譯的 , 而函數顯然是編譯以後 , 在執行時 , 才調用的 . 所以 , 宏佔用的是編譯的時間 , 而函數佔用的是執行時的時間 .
4.
宏的參數是不佔內存空間的 , 由於只是作字符串的替換 , 而函數調用時的參數傳遞則是具體變量之間的信息傳遞 , 形參做爲函數的局部變量 , 顯然是佔用內存的 .
5.
函數的調用是須要付出必定的時空開銷的 , 由於系統在調用函數時 , 要保留現場 , 而後轉入被調用函數去執行 , 調用完 , 再返回主調函數 , 此時再恢復現場 , 這些操做 , 顯然在宏中是沒有的 .
 
   如今來看內聯函數 :

所謂 " 內聯函數 " 就是將很簡單的函數 " 內嵌 " 到調用他的程序代碼中 , 只樣作的目的是爲了不上面說到的第 5 , 目的旨在節約下本來函數調用時的時空開銷 . 但必須注意的是 : 做爲內聯函數 , 函數體必須十分簡單 , 不能含有循環、條件、選擇等複雜的結構,不然就不能作爲內聯函數了。事實上,即使你沒有指定函數爲內聯函數,有的編譯系統也會自動將很簡單的函數做爲內聯函數處理;而對於複雜的函數,即使你指定他爲內聯函數,系統也不會理會的。
 
  函數和宏函數的區別 就在於,宏函數佔用了大量的空間,而函數佔用了時間。你們要知道的是,函數調用是要使用系統的棧來保存數據的,若是編譯器裏有棧檢查選項,通常在函數的頭會嵌入一些彙編語句對當前棧進行檢查;同時, CPU 也要在函數調用時保存和恢復當前的現場,進行壓棧和彈棧操做,因此,函數調用須要一些 CPU 時間。 而宏函數不存在這個問題。宏函數僅僅做爲預先寫好的代碼嵌入到當前程序,不會產生函數調用,因此僅僅是佔用了空間,在頻繁調用同一個宏函數的時候,該現象尤爲突出。
相關文章
相關標籤/搜索