C++ 内联函数



什么是 C++ 内联函数

C++ inline 函数是一个强大的概念,通常与类一起使用。如果一个函数是内联的,编译器会在编译时将该函数代码的副本放置在每个调用该函数的位置。

对内联函数的任何更改都可能需要重新编译该函数的所有客户端,因为编译器需要再次替换所有代码,否则它将继续使用旧的功能。

定义内联函数

要定义内联函数,请在函数名前放置关键字 inline,并在进行任何对函数的调用之前定义该函数。如果定义的函数超过一行,编译器可以忽略内联限定符。

类定义中的函数定义是内联函数定义,即使没有使用 inline 说明符。

示例

以下是一个示例,它使用内联函数返回两个数字中的最大值:

#include <iostream>
 
using namespace std;

inline int Max(int x, int y) {
   return (x > y)? x : y;
}

// Main function for the program
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:
    // Function to set the values
    void setValues(int a, int b);

    // Function to print the values
    void printValues();

    // Inline function to add the two numbers
    inline int addNumbers();
};

// Member function definitions
void Number::setValues(int a, int b) {
    num1 = a;
    num2 = b;
}

void Number::printValues() {
    cout << "Number 1: " << num1 << ", Number 2: " << num2 << endl;
}

// Inline function definition
inline int Number::addNumbers() {
    return num1 + num2;
}

int main() {
    // Create an object
    Number n;

    // Set the values
    n.setValues(10, 20);

    // Print the values
    n.printValues();

    // Add the numbers and print the result
    int sum = n.addNumbers();
    cout << "Sum of the numbers: " << sum << endl;

    return 0;
}

内联函数的优点

以下是使用内联函数的优点:

  • 对于内联函数,不会发生函数调用开销。
  • 内联函数节省了在调用函数时将变量压入和弹出堆栈的开销。
  • 内联函数节省了从函数返回的开销。
  • 创建内联函数时,编译器可能会对函数体执行特定于上下文的优化。对于普通函数,不会执行这种优化。
  • 使用小型内联函数可能对嵌入式系统有用,因为内联可以产生比函数调用序言和返回更少的代码。

内联函数的缺点

内联函数的一些缺点如下:

  • 当我们使用内联函数时,代码的大小会增加,因为编译器用内联函数代码替换每个函数调用。
  • 大型代码需要更多内存和时间来编译代码。
  • 编译过程会变慢,因为编译器会在函数调用的位置评估和替换函数代码。
  • 在某些情况下,程序的性能可能会降低。
  • 根据函数代码的复杂性,编译器可能会忽略 inline 关键字。因此,内联函数的应用是有限的。

内联函数的一些缺点如下:

cpp_classes_objects.htm
广告