C++ 内联函数
C++ 中的内联函数是什么
C++ inline 函数是一个强大的概念,常用于类中。如果一个函数是内联的,编译器会在编译时将该函数的代码副本放置在每个调用该函数的位置。
对内联函数的任何更改都可能需要重新编译该函数的所有客户端,因为编译器需要再次替换所有代码,否则它将继续使用旧的功能。
定义内联函数
要定义内联函数,请在函数名称前添加关键字 inline,并在对该函数进行任何调用之前定义该函数。如果定义的函数超过一行,编译器可以忽略 inline 限定符。
类定义中的函数定义是内联函数定义,即使没有使用 inline 说明符也是如此。
示例
以下示例利用内联函数返回两个数字中的最大值 -
#include <iostream> using namespace std; inline int Max(int x, int y) { return (x > y)? x : y; } // 程序的主函数 int main() { cout << "Max (20,10): " << Max(20,10) << endl; cout << "Max (0,200): " << Max(0,200) << endl; cout << "Max (100,1010): " << Max(100,1010) << endl; return 0; }
当编译并执行上述代码时,它会产生以下结果 -
Max (20,10): 20 Max (0,200): 200 Max (100,1010): 1010
类中的内联函数
默认情况下,类中定义的所有函数都是隐式内联的。如果要显式地将函数定义为内联函数,则必须在类内部声明该函数,并将其定义写在类外部。inline 关键字用于类声明外部的函数定义。
示例
在下面的示例中,我们将使用类定义一个内联函数 -
#include <iostream> using namespace std; class Number { private: int num1; int num2; public: // 设置值的函数 void setValues(int a, int b); // 打印值的函数 void printValues(); // 用于将两个数字相加的内联函数 inline int addNumbers(); }; // 成员函数定义 void Number::setValues(int a, int b) { num1 = a; num2 = b; } void Number::printValues() { cout << "Number 1: " << num1 << ", Number 2: " << num2 << endl; } // 内联函数定义 inline int Number::addNumbers() { return num1 + num2; } int main() { // 创建对象 Number n; // 设置值 n.setValues(10, 20); // 打印值 n.printValues(); // 将数字相加并打印结果 int sum = n.addNumbers(); cout << "Sum of the numbers: " << sum << endl; return 0; }
内联函数的优点
使用内联函数的优点如下:
- 使用内联函数时,不会产生函数调用开销。
- 调用函数时,内联函数节省了将变量压入堆栈和弹出堆栈的开销。
- 内联函数节省了函数返回调用的开销。
- 创建内联函数时,编译器可能会对函数体执行上下文相关的优化。普通函数不会执行此类优化。
- 使用小型内联函数可能对嵌入式系统有用,因为内联函数产生的代码比函数调用前言和返回代码更少。
内联函数的缺点
内联函数的一些缺点如下:
- 使用内联函数时,代码大小会增加,因为编译器会用内联函数代码替换每个函数调用。
- 大型代码会占用更多内存和编译时间。
- 编译过程会变慢,因为编译器会在函数调用处评估并替换函数代码。
- 在某些情况下,程序的性能可能会降低。
- 根据函数代码的复杂度,编译器可能会忽略 inline 关键字。因此,内联函数的应用受到限制。
内联函数的一些缺点如下: