天天看點

【C++】深入基礎——内聯函數inline詳解

inline内聯函數(内置函數/内嵌函數)

前提了解:

函數調用  CPU一行行執行主調函數代碼,在遇到被調用函數時,主調函數暫停,CPU去執行被調用函數的代碼;當它執行完後 才傳回主調函數,繼續執行。這個過程有時間和空間的開銷。

                 一個C/C++程式的執行過程可以認為是多個函數之間的互相調用過程,形成一個調用鍊條,鍊條起/終點為main()。

内聯函數  在編譯時就将函數調用處用函數體替換

#include <iostream>
using namespace std;

//内聯函數,交換兩個數的值
inline void swap(int *a, int *b){
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int main(){
    int m, n;
    cin>>m>>n;
    cout<<m<<", "<<n<<endl;
    swap(&m, &n);
//相當于直接替換掉上面一行
/*int temp;
temp = *(&m);
*(&m) = *(&n);
*(&n) = temp;*/
    cout<<m<<", "<<n<<endl;

    return 0;
}
           

1.inline函數是用于實作的關鍵字,而不是用于聲明的關鍵字

inline 必須與函數定義體放在一起才能使函數成為内聯函數,僅将inline與函數聲明放一起不起作用

2.内聯函數應該放在頭檔案中定義

放在頭檔案中,其他源檔案可以做一份拷貝(編譯器做)

【C++】深入基礎——内聯函數inline詳解
【C++】深入基礎——内聯函數inline詳解
【C++】深入基礎——内聯函數inline詳解

隻要 inline 函數的定義在某個源檔案中隻出現一次,而且在所有源檔案中,其定義必須是完全相同的即可。

内聯函數替代宏

宏定義  #define是宏定義指令,将一個辨別符定義為一個字元串,在預編譯時将宏名(辨別符)替換為字元串

//不帶參數的宏定義--
#define PI 3.1415926
//宏名一般大寫
//預編譯:在編譯之前,不做文法檢查
//後面不加分号;
//可以用#undef指令終止宏定義的作用域
//宏定義不配置設定記憶體,變量定義配置設定記憶體

//帶參數的宏定義
#define S(a,b) a*b
area=S(3,2);
//第一步被換為area=a*b; ,第二步被換為area=3*2;
           

宏定義弊端

#define  CALL_MAX_FUN(a, b)  f((a) > (b) ? (a) : (b))
  int a = 5, b=0;
  CALL_MAX_FUN(++a, b);              //a自增2次
//f((++a)>(b)?(++a):(b));
  CALL_MAX_FUN(++a, b+10);        //a自增1次
//f((++a)>(b+10)?(++a):(b+10)); 因判斷否
           

同樣的調用,竟然會因為參數的不同,導緻a的結果值不同。

inline内聯函數替換

template<typename T>
  inline void CallMaxFun(const T& a, const T& b)
  {
    f( a > b ? a : b);
  }
           

繼續閱讀