天天看點

内聯函數與宏的差別

産生:

   内聯函數(有時稱作線上函數或編譯時期展開函數)是一種程式設計語言結構,用來建議編譯器對一些特殊函數進行内聯擴充;也就是說建議編譯器将指定的函數體插入并取代每一處調用該函數的地方(上下文),進而節省了每次調用函數帶來的額外時間開支。但在選擇使用内聯函數時,必須在程式占用空間和程式執行效率之間進行權衡,因為過多的比較複雜的函數進行内聯擴充将帶來很大的存儲資源開支。

比較:

  (1)宏調用并不執行類型檢查,甚至連正常參數也不檢查,但是函數調用卻要檢查。

  (2)C語言的宏使用的是文本替換,可能導緻無法預料的後果,因為需要重新計算參數和操作順序。

  (3)在宏中的編譯錯誤很難發現,因為它們引用的是擴充的代碼,而不是程式員鍵入的。

  (4)許多結構體使用宏或者使用不同的文法來表達很難了解。内聯函數使用與普通函數相同的語言,可以随意的内聯和不内聯。

  (5)内聯代碼的調試資訊通常比擴充的宏代碼更有用。

内聯函數的缺點:

   (1)通常,編譯器比程式設計者更清楚對于一個特定的函數是否合适進行内聯擴充;一些情況下,對于程式員指定的某些内聯函數,編譯器可能更傾向于不使用内聯甚至根本無法完成内聯。

   (2)對于一些開發中的函數,它們可能從原來的不适合内聯擴充變得适合或者倒過來。盡管内聯函數或者非内聯函數的轉換易于宏的轉換,但增加的維護開支還是使得它的優點顯得更不突出了。

   (3)對于基于C的編譯系統,内聯函數的使用可能大大增加編譯時間,因為每個調用該函數的地方都需要替換成函數體,代碼量的增加也同時帶來了潛在的編譯時間的增加。

宏的缺點:

  1. 由于是直接插入的,代碼量會增加。

  2. 嵌套定義過多可能會影響程式的可讀性,而且很容易出錯。

  3. 對帶參的宏而言,由于是直接替換,不會檢查參數,存在安全隐患。

繼續閱讀