1. 程式人生 > >C++深度解析教程學習筆記(3)函數的擴展

C++深度解析教程學習筆記(3)函數的擴展

插入 分享 技術 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)函數的擴展