2013年12月13日 星期五

inline

行內函數、內聯函數

就軟體工程觀點,使用函數是很好的作法,但多了函數呼叫來回的額外負擔,特別是小的、經常呼叫的函數。將函數 qualifier 為 inline 可節省呼叫的額外負擔。
  • 空間換取時間 -- 函數程式碼會複製多份,可能使得程式變大了。
  • 如果 inline 函數的參數有常數,編譯時可以加以簡化,所以未必包含整個 inline 函數的程式碼。
  • 只是建議編譯器 inline 處理,未必採納,編譯器保有最終決定權。
    • 比較:static inline 強迫編譯器 inline 處理
    • GCC -Winline 提供 inline 函數失敗的原因
  • 只需要定義於表頭檔
  • inline 的函數改變時,使用它的程式都需要重新編譯。
  • 告訴 GCC 嘗試 inline 所有夠簡單的函數:-finline-functions

跟 #define (巨集) 比較
  • 巨集不能將 C++ 非 public 變數傳出去
  • 兩者結果有時不同。巨集像是字串取代,inline 像是函數
  • 巨集在行數多時不易理解
  • 題外話:#define function(x) do{...}while(0) /* 避掉 ; 問題 */


參考:
  1. http://blog.yam.com/swwuyam/article/11745212
  2. GCC: An Inline Function is As Fast As a Macro

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...