define 巨集函式,為什麼能夠提高效能?

2021-08-14 14:42:29 字數 979 閱讀 8469

#define s(a,b) a*b    //正確的巨集定義是#define s(r) ((r)*(r)) 

area=s(3,2);第一步被換為area=a*b; ,第二步被換為area=3*2; 類似於函式呼叫,有乙個啞實結合的過程:

預處理(預編譯)工作也叫做巨集展開:在編譯之前,就將巨集名替換為字串。

優點:巨集 ——

1)**在預處理期被簡單文字替換, 類似於c++的內聯函式;

巨集替換只作替換,不做計算,不做表示式求解 . what's mean?

2)可完成函式呼叫的功能,又能減少系統開銷,提高執行效率。

巨集是在預編譯時執行的,

而函式是在執行時執行的。

在預處理階段即進行了巨集展開(巨集替換),在執行時不需要轉換,即在當地執行

巨集定義不分配記憶體,變數定義分配記憶體。巨集定義不存在型別問題,它的引數也是無型別的。[

3)函式呼叫在編譯後程式執行時進行,並且分配記憶體。巨集替換在編譯前進行,不分配記憶體 .

巨集展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體、保留現場、值傳遞、返回值)

缺點:1)所占用的目標**空間相對較大。犧牲空間來換取時間 ,

函式體很大時不要#define,否則空間時間都得不到

2)不方便除錯

注意:1)巨集名和引數的括號間不能有空格

#define squ are(x) ((x) * (x))  ——————錯

#define square(x ) ((x) * (x)) ——————錯

2)巨集定義末尾不加分號;

sudo cd為什麼不能夠執行

我想要cd到 etc docker,但是它給我乙個許可權不夠的錯誤,然後,我想到使用sudo cd etc docker時,它告訴我sudo cd 找不到命令。於是,鬱悶的我就去上網找了下原因。cd不是乙個應用程式而是linux內建的命令,而sudo僅僅只對應用程式起作用。sudo foo只意味著以...

sudo cd為什麼不能夠執行

ubuntu vm 0 16 ubuntu home cd root bash cd root permission denied ubuntu vm 0 16 ubuntu home sudo cd root sudo cd command not found ubuntu vm 0 16 ubu...

如何用 define巨集定義多行函式

在軟體開發過程中,經常有一些常用或者通用的功能或者 段,這些功能既可以寫成函式,也可以封裝成為巨集定義。那麼究竟是用函式好,還是巨集定義好?這就要求我們對二者進行合理的取捨。首先,函式呼叫會帶來額外的開銷,它需要開闢一片棧空間,記錄返回位址,將形參壓棧,從函式返回還要釋放堆疊。這種開銷不僅會降低 效...