內聯函式和巨集的區別

2021-09-30 10:55:24 字數 907 閱讀 6155

先說巨集和函式的區別:

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

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

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

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

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

現在來看內聯函式:

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

最本質的區別是:

編譯器會將內聯函式的**本身做優化,看起來完全沒有函式的痕跡

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

內聯函式和巨集的區別

首先要說明的是內聯函式只在c 中有這個概念,在c語言中沒有。1.巨集的缺陷 為什麼要使用巨集呢?因為函式的呼叫必須要將程式執行的順序轉移到函式所存放在記憶體中的某個位址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作要求在轉去執行前儲存現場並且記憶執行的位址,轉回後要恢復現場...

內聯函式和巨集的區別

1 替換的時機 內聯函式是在編譯期間進行替換,就是將該函式在函式的呼叫點直接展開 巨集函式是在預處理階段替換 2 替換的成功率 內聯函式只是對編譯器的乙個建議,如果編譯器覺得該函式不適合成為內聯函式時,便會忽略前面的 inline 關鍵字,比如我們將遞迴函式寫成內聯函式,編譯器會忽略前面的 inli...

巨集和內聯函式的區別

巨集和內聯函式的區別 總結 內聯函式是對巨集的優化 1 巨集 巨集常量例 deifne pi 3.14 優點 一改全改,調高 的復用性 提高效能 缺點 定義巨集出錯時,不容易定位錯誤,因為預處理階段進行了替換 展開 在c 中對巨集常量進行了優化 用const 修飾變數 同時const具有巨集常量的屬...