03-行內函數
阿新 • • 發佈:2020-12-29
技術標籤:C++
行內函數
產生原因
C 語言中有巨集函式的概念。巨集函式的特點是內嵌到呼叫程式碼中去,避免了函式呼叫的開銷。但是由於巨集函式的處理髮生在預處理階段,缺失了語法檢測和有可能帶來的語意差
錯。
巨集函式和普通函式的區別
優缺點 | 巨集函式 | 普通函式 |
---|---|---|
優點 | 內嵌程式碼,闢免壓棧與出棧的開銷。 | 高度抽象,避免重複開發,型別檢查 |
缺點 | 程式碼替換,易使生成程式碼體積變大, 易產生邏輯錯誤, 無型別檢查 | 壓棧與出棧,帶來開銷 |
程式碼示例
#include <iostream>
/**
* 巨集函式和普通函式
*/
using namespace std;
// 定義巨集函式
#define SQR(x) ((x)*(x))
// 定義sqr函式
int sqr(int x)
{
return x*x;
}
int main()
{
// 定義變數
int i=0;
// 條件判斷
while(i<5)
{
printf("%d\n",SQR(i++));
//printf("%d\n",sqr(i++));
}
return 0;
}
程式執行結果
常量與巨集函式
在C++中const常量可以替代巨集常數定義。
const intA = 3; == #define A3
行內函數
行內函數定義
C++編譯器可以將一個函式進行內聯編譯,被C++編譯器內聯編譯的函式叫做行內函數
特點
- C++編譯器直接將函式體插入函式呼叫的地方。
- 行內函數沒有普 通函式呼叫時的額外開銷 (壓棧,跳轉,返回 )。
- C+ +編譯器不一定滿足函式的內聯請求。
C++中推薦使用行內函數替代巨集程式碼片段,C++中**使用inline關鍵字宣告行內函數**。
程式碼示例
inline int func(int a,int b)
{
returna<b?a:b;
}
注意:
行內函數宣告時inline關鍵字必須和函式定義,結合在一起,否則編譯器會直接忽略內聯請求。
程式碼示例
#include <iostream>
using namespace std;
// 定義巨集函式
#define FUNC(a, b) ((a) < (b) ? (a) : (b))
// 呼叫行內函數
inline int function(int a, int b)
{
return a < b ? a : b;
}
int main(int argc, char *argv[])
{
int a = 1;
int b = 3;
// 呼叫巨集函式
//int c = FUNC(++a, b);
// 呼叫函式
int c = function(++a, b);
// 輸出 a b c的值
cout << "a:"<< a << endl << "b:"<< b << endl << "c:" << c << endl;
return 0;
}
程式執行結果
總結
- 行內函數具有普通函式的特徵(引數檢查,返回型別等)。
- 函式的內聯請求可能被編譯器拒絕。
- 函式被內聯編譯後,函式體直接擴充套件到呼叫的地方。
- 巨集程式碼片段由前處理器處理,進行簡單的文字替換,沒有任何編譯過程,因此可能出現副作用。
注意事項
C++中inline內聯編譯的限制
不能存在任何形式的迴圈語句,不能存在過多的條件判斷語句。函式體不能過於龐大,不能對函式進行取址操作。
函式內聯宣告必須在呼叫語句之前。