1. 程式人生 > 其它 >03-行內函數

03-行內函數

技術標籤: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內聯編譯的限制

不能存在任何形式的迴圈語句,不能存在過多的條件判斷語句。函式體不能過於龐大,不能對函式進行取址操作。
函式內聯宣告必須在呼叫語句之前。