巨集函式和函式的區別及優缺點
阿新 • • 發佈:2019-02-15
區別
測試用例:
巨集函式:#define MAX(a,b) ((a)>(b)?(a):(b))
普通函式:MAX(a,b) {return a>b?a:b}
1.巨集做的是簡單的字串的替換,而函式是引數的傳遞,引數是有資料型別的。
2.巨集的引數替換是直接替換的,不經任何計算,而函式呼叫時將形參的值傳給形參。
3.巨集在編譯之前進行(先用巨集體替換巨集名,再進行編譯),而函式是在編譯之後執行時才呼叫的。
4.巨集的引數是不佔記憶體空間的,因為只做字串的替換,而函式呼叫時引數之間的傳遞,所以佔用記憶體。
5.函式呼叫需要空間開銷,因為在函式呼叫時它既要儲存現場又要跳轉到另一個函式呼叫中去執行,然後還要返回現場,但巨集函式中就不存在。
優缺點
1.使用巨集函式定義編譯生成的目標檔案比普通函式生成的目標檔案大。
2.巨集函式會導致程式碼的執行效率降低。
測試用例:
int a[]={9,3,5,2,1,0,7,6,4};
int max(n)
{
return n==0?a[0]:MAX(a[n],max(n-1));
}
int main()
{
max(9);
return 0;
}
巨集展開為(a[n]>max(n-1)?a[n]:max(n-1)),其中max(n-1)被呼叫了兩遍,這樣依次遞迴下去,時間複雜度會很高。
3.主要小心使用還是會顯著的提高程式碼的執行效率。