內聯函數是一種特殊的函數,具有普通函數的特征(參數檢查,返回類型等)
內聯函數是對編譯器的一種請求,因此編譯器可能拒絕這種請求
內聯函數由 編譯器處理,直接將編譯后的函數體插入調用的地方
宏代碼片段 由預處理器處理, 進行簡單的文本替換,沒有任何編譯過程
注:內聯函數聲明時inline關鍵字必須和函數定義結合在一起,否則編譯器會直接忽略內聯請求。
C++中內聯編譯的限制:
不能存在任何形式的循環語句
不能存在過多的條件判斷語句
函數體不能過于龐大
不能對函數進行取址操作
函數內聯聲明必須在調用語句之前
編譯器對于內聯函數的限制并不是絕對的,內聯函數相對于普通函數的優勢只是省去了函數調用時壓棧,跳轉和返回的開銷。
因此,當函數體的執行開銷遠大于壓棧,跳轉和返回所用的開銷時,那么內聯將無意義
#include <stdio.h>#define MAX(a, b) f((a) > (b) ? (a) : (b)) void f (int max)
{printf ("max = %d\n", max);
}// 內聯函數代替宏函數
// 在普通函數前加 關鍵字 inline 將函數變成內聯函數
// inline 必須要和函數定義放一起,如果和函數聲明放一起會被忽略
// define 是預處理器處理的 inline 是編譯器處理的
// define 沒有函數參數檢測,返回檢測,作用域檢測,inline 工作方式像一個函數
// 所以會有參數類型檢測等
// inline是向請求在調用該函數的時候進行函數體的替換,編譯器可能拒絕內聯請求
// 如果內聯成功,編譯完以后代碼是沒有這一段函數的// 內聯函數函數體不能過長,最好不要超過 5 行
// 不能有循環語句,復雜的 if 語句
// 不能對內聯函數進行取地址操作
inline int max(int a, int b)
{return (a>b ? a : b);
}int main7_2()
{int a = 10;int b = 20;f(10);f (max(a, b++));printf ("b = %d\n", b);return 0;
}int main7_1()
{int a = 10;int b = 20;MAX(a, b++); // f((a) > (b++) ? (a) : (b++))printf ("b = %d\n", b);return 0;
}