巨集函式與自定義函式的區別(面試總結)

2021-07-15 20:33:09 字數 785 閱讀 8428

在c語言中,函式式巨集定義和自定義函式的區別是什麼?

自定義函式:

巨集函式

(1)函式式巨集定義的引數沒有型別,預處理器只負責做形式上的替換,而不做引數型別檢查,所以危險性高;但因為省去了函式的呼叫,返回,釋放,所以效率比自定義函式高;

(2)呼叫真正函式的**和呼叫函式式巨集定義的**編譯生成的指令不同。

如果max是個普通函式,那麼它的函式體return a > b ? a : b; 要編譯生成指令,**中出現的每次呼叫也要編譯生成傳參指令和call指令。而如果max是個函式式巨集定義,這個巨集定義本身倒不必編譯生成指令,但是**中出現的每次呼叫編譯生成的指令都相當於乙個函式體,而不是簡單的幾條傳參指令和call指令。所以,使用函式式巨集定義編譯生成的目標檔案會比較大。

(3)在執行複雜功能時,如遞迴,函式式巨集定義往往會導致較低的**執行效率。

儘管函式式巨集定義和普通函式相比有很多缺點,但只要小心使用還是會顯著提高**的執行效率,畢竟省去了分配和釋放棧幀、傳參、傳返回值等一系列工作,因此那些簡短並且被頻繁呼叫的函式經常用函式式巨集定義來代替實現。

總結 巨集函式和自定義函式的區別

巨集函式和自定義函式的區別?自定義函式 includeint max int a,int b int main 巨集函式 include define max x,y x y x y int main c程式由源程式變為可執行檔案的三個階段是 預處理階段,由預處理器對程式文字中的巨集進行展開。編譯階...

關於自定義函式和巨集定義

一 static 此定義型別有以下3種情況 1 當修飾乙個全域性變數時,這個變數的作用域被改變了,只能在當前檔案中呼叫 2 當修飾乙個區域性變數時,改變了變數的生命週期,直到程式結束才會被釋放。注 一般的呼叫函式中定義的區域性變數預設儲存在棧空間,而如果是被static修飾的區域性變數儲存在資料段內...

自定義函式與儲存過程的區別

儲存過程和自定義函式的區別 difference between procedure and user defined function 首先來看一下儲存過程和自定義函式的概念 一 什麼是儲存過程?儲存過程可以使得對資料庫的管理 以及顯示關於資料庫及其使用者資訊的工作容易得 多。儲存過程是 sql ...