C++ 中的行內函數
Suraj P
2023年1月30日
2022年4月20日
-
為什麼在 C++ 中使用
inline
函式 -
在 C++ 中實現
內聯
函式 -
在 C++ 中將
constructor
和destructor
實現為inline
函式 -
在 C++ 中實現
inline
函式的優缺點
本文將討論 C++ 中的 inline
函式、如何實現它們以及使用它們的優缺點。
為什麼在 C++ 中使用 inline
函式
每當我們執行程式時,CPU 都會在函式呼叫之後儲存指令的記憶體地址;它將引數複製到堆疊上並將控制權轉移到指定的函式。
然後 CPU 執行程式碼,返回特定記憶體位置的值,並再次返回到被呼叫的函式。如果大部分時間都花在切換而不是執行功能上,它可能會產生額外的開銷。
這種開銷在執行復雜的 CPU 密集型任務的大型函式中是微不足道的,因為大部分時間只花在執行上。
但是,當我們有許多隻執行基本任務的小功能時,這種開銷會變得很大。大部分時間都花在切換上,幾乎沒有時間花在執行上。
因此,當我們有許多小功能以節省切換時間並提高效率時,內聯
的概念會很方便。
每當在編譯時在程式碼中將任何函式宣告為內聯
時,它不會在函式呼叫時分配地址,而是複製整個函式程式碼並將其放在該位置。
語法:
inline return_type function_name(arguments)
{
...
}
inline
函式只是對編譯器的請求,因此編譯器可以在以下情況下忽略它:
- 函式有靜態變數;
- 函式有
goto
或switch
語句; - 函式是遞迴的;
- 函式有迴圈。
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++ 中將 constructor
和 destructor
實現為 inline
函式
使用上面的例子並在定義類的同時在類之外製作 inline
函式,我們甚至可以將 constructor
和 destructor
製作為 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
函式的一些優點:
- 減少函式呼叫的開銷。
- 它節省了函式返回撥用的開銷。
- 節省入棧和出棧變數的開銷。
雖然有用,但它也有一些缺點:
- 如果我們使用過多的
inline
函式,二進位制可執行檔案的大小可能會變大,因為這裡會發生相同程式碼的重複。 - 行內函數過多會降低指令的快取命中率,從而影響指令從快取記憶體到主記憶體的速度。
- 在程式碼大小比速度更重要的嵌入式系統中,
內聯
函式將無濟於事。 - 可能會出現抖動,這會降低計算機的記憶體效能。
Author: Suraj P