inline 關鍵字主要功能是為了 代替掉 宏代碼片段。
在C++中使用關鍵字inline關鍵字聲明內聯函數。
inline int fun(int a,int b) { return a < b ? a : b; //如果a<b 成立 a=a 否則a=b }
#include <stdio.h> #define FUN(a,b) ((a) < (b) ? (a) : (b)) inline int fun(int a,int b) { return a < b ? a : b; //如果a<b 成立 a=a 否則a=b } int main(int argc, char *argv[]) { int a = 1,b=3; int val = FUN(++a,b); printf("Begin...\n"); printf("val = %d\n",val); printf("a = %d\n",a); printf("b = %d\n",b); printf("End...\n"); return 0; }
如果調用宏FUN int val = FUN(++a,b); 展開就是 int val = ((++a) < (b) ? (++a) : (b)); 這里的Val = 3
而調用 fun 這個函數 int val = 2
從而說明 宏代碼塊有一個缺點就是宏代碼塊只是做內容的替換。
C++ 中inline 內聯編譯的限制:
1、不能存在任何形式的循環語句
2、不能存在過多的條件判斷語句
3、函數體不能過於龐大
4、不能對該函數進行取地址操作
5、內聯函數聲明必須在調用語句之前。
內聯函數:
C++編譯器可以將一個函數進行內聯編譯
C++編譯器直接將函數體插入函數調用的地方,從而內聯函數沒有普通函數調用時的額外開銷。(壓棧、跳轉、返回)。
注意:C++編譯器不一定滿足函數的內聯請求,也就是說使用inline 關鍵字聲明內聯函數可能會被編譯器拒絕。從而建立內聯失敗
強制內聯:
C++編譯器提供了 擴展語法,能夠對函數進行強制內聯
g++ :_attrbute_((always_inline)) 屬性
MSVS:_forceinline