C 中的內聯函式(inline)與巨集定義

2021-08-29 07:19:44 字數 944 閱讀 9211

當我們定義完乙個函式之後,實際呼叫的時候,函式體本身會壓入堆疊,主函式再從堆疊裡面把這部分內容提取出來,產生一定的系統開銷,對於大型函式來說,這部分開銷可能相對於函式體本身執行的開銷來說微乎其微。但是如果乙個函式僅僅只是為了完成乙個特別簡單的功能,比如交換兩個變數的值,亦或是求兩個變數的最大值,這時,呼叫函式的開銷,可能就會大於函式體執行本身了。作為乙個追求高效能的程式而言,大量的這種函式呼叫的堆積,勢必會使得整體的效能下降。

例如,下面這個返回a和b最大值的函式,

#includeusing namespace std;

int max(int a,int b)

int main()

int main() {

int a = 3;

int b = 5;

cout但是需要注意的是,內聯函式不可以直接用於沒有定義的函式宣告。此外,在物件導向程式設計中,定義在類內的成員函式預設定義為內聯函式。可以使用所在類的保護成員和私有成員。

巨集定義具有兩個缺點:一是不能除錯,二是只是進行了簡單的文字替換,如果重複使用的話,可能會出現重定義的情況。而與之相比的話,內聯函式就很靈活了。下面的這個例子很生動,

#define square(x) x*x

巨集定義時通過文字替換開實現的--x是引數的符號標記。

a = square(5.0);   //->a=5.0*5.0;

b = square(4.5+7.5); //->b=4.5+7.5*4.5+7.5

d = square(c++); //->d=c++*c++

可以看出,對於b,需要使用括號才能正常運算。

#define square(x) ((x)*(x))
對於c,卻仍遞增了兩次。

因此,巨集定義和內聯函式存在本質的區別,轉換的時候應考慮是否轉換後功能是否正常。

巨集和c 中的inline內聯函式

inline函式是c 引入的機制,目的是解決使用巨集定義的一些缺點。1.為什麼要引入內聯函式 內聯函式的作用 用它替代巨集定義,消除巨集定義的缺點。巨集定義使用預處理器實現,做一些簡單的字元替換因此不能進行引數有效性的檢測。另外它的返回值 不能被強制轉換為可轉換的合適 型別,且c 中引入了類及類的訪...

C 中inline內聯函式和巨集之間的區別

inline函式是c 引入的機制,目的是解決使用巨集定義的一些缺點。用它替代巨集定義,消除巨集定義的缺點。巨集定義使用預處理器實現,做一些簡單的字元替換,因此不能進行引數有效性的檢測。另外它的返回值不能被強制轉換為可轉換的合適型別,且c 中引入了類及類的訪問控制,在涉及到類的保護成員和私有成員就不能...

inline函式 C 內聯函式 inline

inline要起作用,必須要與函式定義放在一起,而不是函式的宣告 inline 當編譯器處理呼叫內聯函式的語句時,不會將該語句編譯成函式呼叫的指令,而是直接將整個函式體的 插人呼叫語句處,就像整個函式體在呼叫處被重寫了一遍一樣,在執行時是順序執行,而不會進行跳轉。優點 內聯函式沒有執行函式呼叫的開銷...