巨集與內聯函式的區別

2021-07-08 15:22:39 字數 849 閱讀 1818

總結目的:本人曾經一度選擇放棄開發崗位,然後僅僅三個月之後又覺得自己的選擇是錯誤的,還是應該繼續自己比較擅長的開發,然而一次面試卻讓我發現,很小的知識點已經遺忘。

(1)、巨集只做簡單的字串替換,函式是引數傳遞,所以必然有引數型別檢查(支援各種型別,而不是只有字串)。

(2)、巨集不經計算而直接替換引數,函式呼叫則是將引數表示式求值再傳遞給形參。

(3)、巨集在編譯前進行,即先替換再編譯。而函式是編譯後,在執行時才呼叫的。巨集佔編譯時間,而函式佔執行時間。

(4)、巨集引數不佔空間,因為只做字串替換,而函式呼叫時引數傳遞是變數之間的傳遞,形參作為區域性變數佔記憶體空間。

(5)、函式呼叫需要保留現場,然後轉入呼叫函式執行,執行完畢再返回主調函式,這些耗費在巨集中是沒有的。

使用巨集和內聯函式都可以節省在函式呼叫方面的時間和空間開銷。二者都是為了提高效率,但是卻有著顯著的區別:

(1)、在使用時,巨集只做簡單的預處理器符號表(字串)中的簡單替換。而內聯函式可以進行引數型別檢查,且具有返回值(也能被強制轉換為可轉換的合適型別)。

(2)、內聯函式首先是函式,函式的許多性質都適用於內聯函式(如內聯函式可以過載)。

(3)、內聯函式可以作為某個類的成員函式,這樣可以使用類的保護成員和私有成員。而當乙個表示式涉及到類保護成員或私有成員時,巨集就不能實現了(無法將this指標放在合適位置)。

(4)、內聯函式是可以除錯的,而巨集不可以。

可以用內聯函式完全替代巨集。

但是在使用內聯函式時也要注意:作為內聯函式,函式體必須十分簡單,不能包含迴圈,條件,選擇等複雜結構,否則不能作為內聯函式。

實際上,編譯器的優化系統會自動將一些簡單函式變成內聯函式。而一些複雜的函式,即使指定為內聯,編譯器也會自動當作普通函式。

內聯函式與巨集的區別

產生 比較 1 巨集呼叫並不執行型別檢查,甚至連正常引數也不檢查,但是函式呼叫卻要檢查。2 c語言的巨集使用的是文字替換,可能導致無法預料的後果,因為需要重新計算引數和操作順序。3 在巨集中的編譯錯誤很難發現,因為它們引用的是擴充套件的 而不是程式設計師鍵入的。4 許多結構體使用巨集或者使用不同的語...

內聯函式與巨集定義區別

內聯函式和普通函式相比可以加快程式的執行效率,因為它不需要中斷呼叫,在編譯的時候內聯函式可以直接被鑲嵌到目標 中。而巨集只是在預處理階段乙個簡單的字元替換。內聯函式需要做型別檢查,這是相比巨集的乙個優勢。巨集是在 處不加任何驗證的簡單替代,而內聯函式是將 直接插入呼叫處,而減少了普通函式呼叫時的資源...

內聯函式與巨集替換的區別

1 內聯函式在執行時可除錯,而巨集不可以 2 內聯函式可以訪問類的成員變數,而巨集不可以 3 在類中宣告同時定義的簡單的函式,會自動轉換為內聯函式 4 編譯器會對內聯函式的引數型別做安全檢查 內聯函式具有巨集的替換效果,以及普通函式的安全檢查 define max a,b a b a b 一定要帶括...