【C++】行內函數和巨集的區別
阿新 • • 發佈:2018-12-26
行內函數
行內函數指的是用[ inline ]關鍵字修飾的函式,在類體內定義的函式會被預設定義為行內函數
特性
行內函數會在【編譯】期間進行替換,就是將呼叫該函式的地方換成【函式體】(類似於C語言中的巨集,然而巨集是在【預處理】階段進行替換)
行內函數和巨集的不同之處
1、型別檢測
我們先定義一個MAX巨集
上面便定義了一個MAX的巨集,可以求a和b的大小#include<stdio.h> #include<stdlib.h> #define MAX(a,b) (a>b)?a:b int main() { int a = 10; int b = 20; int ret = MAX(a,b); printf("ret = %d\n",ret); system("pause"); return 0; }
然而,利用巨集是有問題
#define MAX(a,b) (a>b)?a:b
int main()
{
int a = 10;
int b = 20;
int ret = MAX(a++,b);
printf("ret = %d\n",ret);
system("pause");
return 0;
}
如果用MAX(a++,b)
則這個是含有副作用的
上例便說明了巨集傳入含有【副作用引數】便會有影響#define MAX(a,b) (a>b)?a:b int main() { int a = 10; int b = 20; int ret = MAX(a++,b);//利用巨集,a的值會被修改 printf("ret = %d\n",ret); system("pause"); return 0; }
行內函數便很好的解決了這個問題
行內函數是畢竟是【函式】,有【引數型別】的判斷。
2、替換時機不同
行內函數在【編譯】的時候替換
巨集在【預處理】階段進行替換
3、替換的成功率
巨集一旦定義則在【預處理】階段一定會替換
行內函數僅僅是對【編譯器】的一個建議
如果編譯器覺得該函式不適合成為行內函數時,便會忽略前面的[ inline ]關鍵字
比如當我們將一個【遞迴】函式,如果編譯器不進行檢測,那麼檔案就會無限的擴大下去
此時,【編譯器】便會忽略[ inline ]關鍵字
總結
總的來說,【行內函數】是消除【函式呼叫】時的開銷。
和巨集類似,一個小的函式宣告成【行內函數】 可以非常受益。
並且避免了巨集傳【副作用引數】的所造成的錯誤。
不管自己定義行內函數與否,【編譯器】會根據自己的判斷來決定是否內聯