發新話題

C++ Gossip - 《函式入門》行內涵式

C++ Gossip - 《函式入門》行內涵式

在函式簡介中的範例,有一個pow2()函式:
int pow2(int num) {
    return num*num;
}


在呼叫函式時會需要分配記憶空間因而需要額外的資源負擔,像pow2()這樣的小函式,可以「建議」編譯器將之設定為「行內涵式」(Inline function),如果建議被採納,則該函式會自動在呼叫點展現為程式碼,行內涵式建議可以直接定義於表頭檔案中,例如:
  • math.h
inline int pow2(int num) {
    return num*num;
}
int pow(int, int);
雖然在表頭檔案中不建議實作函式本體,但行內涵式實際上還是在呼叫它的執行點上被展開,所以行內涵式並不違反這個規則,配合表頭檔案,您可以如下實作 pow()函式本體:
  • math.cpp
#include "math.h"

int pow(int n, int p) {
    int r = 1;

    for(int i = 0; i < p; i++)
        r *= n;
        
    return r;
}
至於範例主函式則不變,如下所示:
  • main.cpp
#include <iostream>
#include "math.h"
using namespace std;

int main() {
   
    int num = 0;
    int power = 0;

    cout << "輸入數值:";
    cin >> num;

    cout << "輸入平方:";
    cin >> power;

    cout << num << "平方:"
         << pow2(num) << endl;
    cout << num << "的" << power << "次方:"
         << pow(num, power)
         << endl;

    return 0;
}
行內涵式只能建議編譯器,也就是說建議並不一定會被採納,這視您的編譯器而定,像是使用到goto、static變數、迴圈、switch等等,這些編譯器可能不接受行內涵式的建議,遞迴函式也無法在呼叫點展開,一個數千行的函式也不適合在呼叫點展開,如果編譯器拒絕將函式展開,它會將該函式視為一般函式進行編譯,inline的建議會被忽略。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。