巨集 函式和內聯函式

2021-09-30 04:09:34 字數 976 閱讀 7369

巨集和函式的區別:

1. 巨集做的是簡單的字串替換(注意是字串的替換,不是其他型別引數的替換),而函式的引數的傳遞,引數是有資料型別的,可以是各種各樣的型別.

2. 巨集的引數替換是不經計算而直接處理的,而函式呼叫是將實參的值傳遞給形參,既然說是值,自然是計算得來的.

3. 巨集在編譯之前進行,即先用巨集體替換巨集名,然後再編譯的,而函式顯然是編譯之後,在執行時,才呼叫的.因此,巨集占用的是編譯的時間,而函式占用的是執行時的時間.

4. 巨集的引數是不佔記憶體空間的,因為只是做字串的替換,而函式呼叫時的引數傳遞則是具體變數之間的資訊傳遞,形參作為函式的區域性變數,顯然是占用記憶體的.

5. 函式的呼叫是需要付出一定的時空開銷的,因為系統在呼叫函式時,要保留現場,然後轉入被呼叫函式去執行,呼叫完,再返回主調函式,此時再恢復現場,這些操作,顯然在巨集中是沒有的.

內聯函式:

所謂"內聯函式"就是將很簡單的函式"內嵌"到呼叫他的程式**中,隻樣做的目的是為了避免上面說到的第5點,目的旨在節約下原本函式呼叫時的時空開銷.但必須注意的是:作為內聯函式,函式體必須十分簡單,不能含有迴圈、條件、選擇等複雜的結構,否則就不能做為內聯函式了。事實上,即便你沒有指定函式為內聯函式,有的編譯系統也會自動將很簡單的函式作為內聯函式處理;而對於複雜的函式,即便你指定他為內聯函式,系統也不會理會的。

函式和巨集函式的區別就在於,巨集函式占用了大量的空間,而函式占用了時間。大家要知道的是,函式呼叫是要使用系統的棧來儲存資料的,如果編譯器裡有棧檢查選項,一般在函式的頭會嵌入一些彙編語句對當前棧進行檢查;同時,cpu也要在函式呼叫時儲存和恢復當前的現場,進行壓棧和彈棧操作,所以,函式呼叫需要一些cpu時間。

而巨集函式不存在這個問題。巨集函式僅僅作為預先寫好的**嵌入到當前程式,不會產生函式呼叫,所以僅僅是占用了空間,在頻繁呼叫同乙個巨集函式的時候,該現象尤其突出。

內聯函式和巨集函式

黑色印記 內聯函式和普通函式相比可以加快程式執行的速度,因為不需要中斷呼叫及返回的過程。在編譯階段內聯函式可以直接被鑲嵌到目標 中。而巨集只是乙個簡單地替換。內聯函式的優勢在於做引數型別檢查,而巨集定義不會。我們知道內聯函式和巨集定義是犧牲記憶體空間換取執行效率的。因此,是否使用內聯函式就要根據實際...

內聯函式和巨集函式

內聯函式和普通函式的區別 普通函式呼叫時是生成呼叫指令跳轉 然後當 執行到呼叫位置時,跳轉到函式所在的 段中執行 而 內聯函式就是直接把函式編譯好的二進位制指令複製到函式的呼叫位置 優點 提高了程式的執行速度 沒跳轉沒返回當然速度快了 但這樣會導致可執行檔案增大 冗餘 也就是犧牲空間來換取時間 顯式...

巨集和函式和內聯函式

巨集和函式的區別 巨集做的是簡單的字串替換 注意是字串的替換,不是其他型別引數的替換 而函式的引數的傳遞,引數是有資料型別的,可以是各種各樣的型別.巨集的引數替換是不經計算而直接處理的,而函式呼叫是將實參的值傳遞給形參,既然說是值,自然是計算得來的.巨集在編譯之前進行,即先用巨集體替換巨集名,然後再...