C++ 內聯函數 inline關鍵字


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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM