帶參函式巨集內聯函式
優點編譯器會做引數的靜態型別檢查
原地展開,沒有呼叫開銷;
並且在預處理階段完成,不占用編譯時間。
函式**被裝入符號表中,在使用時進行替換;
沒有呼叫開銷,效率高,會進行引數型別檢查
缺點需要傳參、棧變數的開闢和銷毀
壓棧、跳轉、返回開銷;
不進行型別檢查,多次巨集替換會導致**體積變大;
一些引數的***會導致得出錯誤的結果。
函式**較長,使用內聯將消耗過多記憶體;
函式體內有迴圈,執行**的時間比較長。
(1)c++中的const常量可以替代巨集常數定義,如: const int a = 3; ←→ #define a 3
(2)c++中是否有解決方案,可以用來替代巨集**片段呢?
2.1 內聯函式的定義
(1)c++編譯器可以將乙個函式進行內聯編譯,被c++編譯器內聯編譯的函式叫內聯函式。
(2)c++中使用inline關鍵字宣告內聯函式。如:
(3)內聯函式宣告時inline關鍵字必須和函式定義結合在一起,否則編譯器會直接忽略內聯請求。
(4)c++中推薦使用內聯函式替代巨集**片段。
2.2 內聯函式的特點
(1)內聯函式具有普通函式的特徵(引數檢查、返回型別等)
(2)c++編譯器直接將內聯函式的函式體插入到函式呼叫的地方
(3)內聯函式沒有普通函式呼叫時的額外開銷(壓棧、跳轉、返回)
(4)c++編譯器也不一定滿足函式的內聯請求,函式的內聯請求可能被編譯器拒絕。
圖1:編譯器拒絕inline請求(仍為函式呼叫)
圖2:函式體被嵌入到呼叫的地方
1 #include 2內聯函式初探3#define func(a, b) ((a) < (b) ? (a) : (b))45
//msvc下:要讓inline、__forceinline生效必須得做如下的設定:6//
①在"專案" → "配置屬性" → "c/c++" → "優化" → "內聯函式擴充套件"中選擇"只適用於__inline(/ ob1)"7//
②在"配置屬性" → "c/c++" → "常規" → "除錯資訊格式"中選擇"程式資料庫( / zi)"
89 inline int func(int a, int
b)10
1314
int main(int argc, char *ar**)
15
2.3 內聯函式與巨集的不同
巨集內聯函式
處理方式由預處理器處理,只是進行簡單的文字替換
由編譯器處理,會將函式體嵌入到呼叫的地方。
但內聯請求也可能被編譯器拒絕
型別檢查不做型別檢查
具有普通函式的特徵,會進行引數和返回型別的檢查
***有
無 2.4 現代c++編譯器對內聯函式的優化
(1)現代c++編譯器能夠進行編譯優化,一些函式即沒有inline宣告,也可能被內聯編譯。
(2)一些現代的c++編譯器提供了擴充套件語法,可用下列列關鍵字替代inline來對函式進行強制內聯,如:
① g++:__atrribute__((always_inline))屬性
② msvc:__forceinline
1 #include 23//內聯函式深度示例msvc2013下:在函式宣告或定義前加inline或__forceinline都可以4//
同時,這兩個的表現行為幾乎一模一樣。只不過__forceinline是ms5//
下的,而inline是標準c++的,可移植性更高。67
//__forceinline8//
__attribute__((always_inline))9//
inline
10int add_inline(int
n);
1112
intmain()
1320
21 __forceinline int add_inline(int
n)22
2930
return
ret;
31 }
最新的c++編譯器只要函式體不是太誇張都可以強制內聯成功。列出下面這些是因為工作中使用的c++編譯器版本可能較低,無法滿足。
(1)不能存在任何形式的迴圈語句
(2)不能存在過多的條件判斷語句
(3)函式體不能過於龐大
(4)不能對函式進行取址操作
(5)函式內聯宣告必須在呼叫語句之前
(1)c++中可以通過inline宣告內聯函式
(2)編譯器直接將內聯函式體擴充套件到函式呼叫的地方
(3)inline只是一種請求,編譯器不一定允許這種請求
(4)內聯函式省去了函式呼叫時壓棧、跳轉和返回的開銷
C 第6課 內聯函式分析
本文學習自 狄泰軟體學院 唐佐林老師的 c 課程 引入 c 內聯函式的引入是為了替換c中巨集 塊功能 實驗1 巨集 塊 vs 內聯函式 注意 在c 開發中首選內聯函式定義 塊,而不是巨集實驗2 強制內聯 c語言中的巨集常量只是在預處理期間進行鍵的文字替換,它的 是並不會進行任何的語法檢查,型別檢查。...
inline函式 第6課 內聯函式分析
一 常量與巨集回顧 c 中的const常量可以替代巨集常數定義,如 const int a 3 等價於 define a 3 那麼c 中是否有解決方案替代巨集 片段呢?請看以下內容。二 內聯函式的定義 1 c 中推薦使用內聯函式替代巨集 片段 2 c 中使用inline關鍵字宣告內聯函式 3 內聯函...
內聯函式分析
1 內聯函式 1 c 中 const 可以代替巨集常量定義。如 const int a 3 define a 3 既然const 可以代替 巨集常量 的定義 是否有其他辦法代替 巨集 呢?有,內聯函式。2 內聯函式。1 c 中推薦使用內聯函式代替巨集 片段。2 c 中使用 inline 關鍵字宣告內...