巨集與函式的優缺點比較
巨集與函式的優缺點比較
資料來源: https://blog.xuite.net/lukeatnchu/blog/221675116-%E6%AF%94%E8%BC%83+macro+%E8%88%87+function+%E7%9A%84%E5%84%AA%E5%8A%A3%E9%BB%9E
https://mp.weixin.qq.com/s?__biz=MzA5NTMwMjIwNA==&mid=2650851938&idx=3&sn=55f07b0934410979270a35661d3c8916&chksm=8bb50d31bcc28427b4af1483f205905a755a3db0bbc91e592bdb56708530c28bb3d8c515be54&scene=126&sessionid=1598246893&key=391633c74d74d5c5e581e271b77709766073477c194d25771a0171cce8eef3bd34b2d29683e674aa6b5e9d9af4702236c5ca2b2572f63098d19749244b565267955443f4341b2f12f2d89727a5b0afcdbb97e6ee0dd4f724402321409dfb93a3e4fdeba9c62aa5d03dd2884c7907617feecde0919aff470a54aef34dc34caca6&ascene=1&uin=MjIwODk2NDgxNw%3D%3D&devicetype=Windows+10+x64&version=62090529&lang=zh_TW&exportkey=Av3j20ghBkctSLnt5oCaODo%3D&pass_ticket=wWHuzb1woL%2BnMo2x3IjxvgKmfMsAYXCpK1H67WrJ9M25EzpMRWUhH%2B6asnGnYmNS
巨集與函數的功能相同,但在編譯時,編譯時會以巨集取代原來的敘述,而函數則是一個跳躍敘述;在程式執行期間,由於巨集已經展開為它所代表的敘述,程式會一行一行執行下去,而碰到函數則是跳到函數定義的副程式去執行。所以,如果將子功能以巨集撰寫,執行速度較快,但編譯後的程式碼較大;函數寫法則執行速度較慢,但是執行檔較小,如何取捨完全看程式設計的目的與需求。
巨集 (macro)
優點:執行速度快,沒有堆疊的 push 和 pop 動作的需要,減少時間的耗損。
缺點:巨集被呼叫多次以後,會耗損存放及使用大量的記憶體空間。
函數 (call function/call subroutine)
優點:即使函數被呼叫多次,在記憶體中仍只有一份實體,較節省記憶體空間。能節省存放及使用的記憶體空間。
缺點:執行速度較慢,需花費時間在堆疊的 push 和 pop 動作上。
心得:
優缺點互補
2 thoughts on “巨集與函式的優缺點比較”
C/C++ function VS #define
inline 有什麼用?
https://www.zhihu.com/question/24185638
inline函數直接在當前frame展開函數代碼,省掉了入棧(堆疊)和出棧(堆疊)的代碼,所以會執行速度會快一些。
這一點功能上類似於宏展開,但是比宏展開好的地方是,inline發生在編譯階段,會做類型檢查,消除了宏展開可能帶來的語義隱患。例如定義宏#define f(x, y) (x*y)就會在f(x+1,y)的時候f(x,y)就變成了x+1*y,完全錯誤。用inline可以達到相同的意圖,卻不會產生錯誤。函數加上inline的好處在於可以節省調用的開銷,而且能夠便於編譯器和上下文配合做優化。但要注意的是inline 只是給編譯器的建議,如果函數體過於復雜,編譯器也是會忽略的。
inline主要用在比較簡單的函數。例如簡單的數學表達式,還有面向對象時候讀取類成員get和set。
其實所有的編譯器,在帶編譯優化選項的時候都會自己做inline,即使你不顯式的加上,這是一個很基本的優化點。
[inline函數 VS 巨集] [inline function VS #define]