C++深度解析教程學習筆記(3)函數的擴展
阿新 • • 發佈:2017-10-28
插入 分享 技術 lsp 預處理器 _for 返回 忽略 結合
1.內聯函數
1.1.常量與宏的回顧
(1)C++中的 const 常量可以替代宏常數定義,如:
const int A = 3; //等價於 #define A 3
(2)C++中是否有解決方案,可以用來替代宏代碼片段呢?
1.2.內聯函數的定義
(1)C++編譯器可以將一個函數進行內聯編譯,被 C++編譯器內聯編譯的函數叫內聯函數。
(2)C++中使用 inline 關鍵字聲明內聯函數。如
inline int func(int a, int b) { return a < b ? a : b; }
(3)內聯函數聲明時 inline 關鍵字必須和函數定義結合在一起,否則編譯器會直接忽略內聯請求。(在 vs2013 下,inline 放在聲明或定義前均可以)
1.3.內聯函數的特點
(1)C++編譯器直接將內聯函數的函數體插入到函數調用的地方
(2)內聯函數沒有普通函數調用時的額外開銷(壓棧、跳轉、返回)
(3)C++中推薦使用內聯函數替代宏代碼片段。
(4)C++編譯器也不一定滿足函數的內聯請求。
#include <stdio.h> #define FUNC(a, b) ((a) < (b) ? (a) : (b)) //MSVC下:要讓inline、__forceinline生效必須得做如下的設置: //①在“項目”→“配置屬性”→“C / C++” →“優化”→“內聯函數擴展”中選擇“只適用於__inline(/ Ob1)”//②在“配置屬性”→“C / C++” →“所有選項”→“調試信息格式”中選擇“程序數據庫( / Zi)” //VS2013下,inline可放在聲明前或也可放在定義前。或兩者前都加 inline int func(int a, int b) { return a < b ? a : b; } int main() { int a = 1; int b = 3; //int c = FUNC(++a, b);//相當於(++a)<(b)?:(++a):(b); //printf("a = %d\n", a); //3 //printf("b = %d\n", b);//3 //printf("c = %d\n", c); //3 int c = func(++a, b); printf("a = %d\n", a);//2 printf("b = %d\n", b);//3 printf("c = %d\n", c);//2 return 0; }
內聯函數沒嵌入到調用地方(仍為函數調用)
函數體被嵌入到調用的地方
1.4.內聯函數與宏的不同
宏 |
內聯函數 |
|
處理方式 |
由預處理器處理,只是進行簡單的文本替換 |
由編譯器處理,會將函數體嵌入到調用的地方。但內聯請求也可能被編譯器拒絕 |
類型檢查 |
不做類型檢查 |
具有普通函數的特征,會進行參數和返回類型的檢查。 |
副作用 |
有 |
無 |
C++深度解析教程學習筆記(3)函數的擴展