C++ 中的行內函數

Suraj P 2023年10月12日
  1. 為什麼在 C++ 中使用 inline 函式
  2. 在 C++ 中實現內聯函式
  3. 在 C++ 中將 constructordestructor 實現為 inline 函式
  4. 在 C++ 中實現 inline 函式的優缺點
C++ 中的行內函數

本文將討論 C++ 中的 inline 函式、如何實現它們以及使用它們的優缺點。

為什麼在 C++ 中使用 inline 函式

每當我們執行程式時,CPU 都會在函式呼叫之後儲存指令的記憶體地址;它將引數複製到堆疊上並將控制權轉移到指定的函式。

然後 CPU 執行程式碼,返回特定記憶體位置的值,並再次返回到被呼叫的函式。如果大部分時間都花在切換而不是執行功能上,它可能會產生額外的開銷。

這種開銷在執行復雜的 CPU 密集型任務的大型函式中是微不足道的,因為大部分時間只花在執行上。

但是,當我們有許多隻執行基本任務的小功能時,這種開銷會變得很大。大部分時間都花在切換上,幾乎沒有時間花在執行上。

因此,當我們有許多小功能以節省切換時間並提高效率時,內聯的概念會很方便。

每當在編譯時在程式碼中將任何函式宣告為內聯時,它不會在函式呼叫時分配地址,而是複製整個函式程式碼並將其放在該位置。

語法:

inline return_type function_name(arguments)
{
...
}

inline 函式只是對編譯器的請求,因此編譯器可以在以下情況下忽略它:

  1. 函式有靜態變數;
  2. 函式有 gotoswitch 語句;
  3. 函式是遞迴的;
  4. 函式有迴圈。

inline 的概念通常與類一起使用。

在 C++ 中實現內聯函式

示例程式碼:

#include <iostream>
using namespace std;

class myClass {
  int a, b;

 public:
  void sum();
};

inline void myClass::sum() {
  cout << "Enter first value:";
  cin >> a;
  cout << "Enter second value:";
  cin >> b;
  cout << "Sum of two numbers is " << a + b << endl;
}

int main() {
  cout << "Program using inline function\n";
  myClass obj;
  obj.sum();
}

在上面的程式碼中,我們在定義函式時將函式宣告為內聯,因為在類外部而不是在類內部編寫實際的內聯函式定義是一種很好的程式設計習慣。

然而,一個類中的函式定義預設是一個 inline 函式定義,即使沒有使用 inline 關鍵字。

輸出:

Program using inline function
Enter first value:12
Enter second value:13
Sum of two numbers is 25

在 C++ 中將 constructordestructor 實現為 inline 函式

使用上面的例子並在定義類的同時在類之外製作 inline 函式,我們甚至可以將 constructordestructor 製作為 inline

示例程式碼:

#include <iostream>
using namespace std;

class myClass {
  int a, b;

 public:
  myClass();
  ~myClass();
  void sum();
};

inline myClass::myClass() {
  a = 100;
  b = 200;
}

inline myClass::~myClass() { cout << "destroying the object\n"; }

inline void myClass::sum() {
  cout << "Sum of two numbers is " << a + b << endl;
}

int main() {
  cout << "Program using inline function\n";
  myClass obj;
  obj.sum();
}

輸出:

Program using inline function
Sum of two numbers is 300
destroying the object

在 C++ 中實現 inline 函式的優缺點

現在,讓我們看看實現 inline 函式的一些優點:

  1. 減少函式呼叫的開銷。
  2. 它節省了函式返回撥用的開銷。
  3. 節省入棧和出棧變數的開銷。

雖然有用,但它也有一些缺點:

  1. 如果我們使用過多的 inline 函式,二進位制可執行檔案的大小可能會變大,因為這裡會發生相同程式碼的重複。
  2. 行內函數過多會降低指令的快取命中率,從而影響指令從快取記憶體到主記憶體的速度。
  3. 在程式碼大小比速度更重要的嵌入式系統中,內聯函式將無濟於事。
  4. 可能會出現抖動,這會降低計算機的記憶體效能。
作者: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

相關文章 - C++ Function