C++ 内联函数

2025 年 4 月 25 日 | 7 分钟阅读

在 C++ 中,内联函数是使用 inline 关键字定义的函数。在内联函数中,编译器在编译时将函数调用替换为函数的原始代码。其主要目的是通过减少函数调用开销来提高程序的性能。

内联函数可以通过将函数代码直接复制到函数调用处来加快代码执行速度。如果对内联函数进行了任何更改,则应重新编译该函数,因为编译器需要更新所有插入函数代码的位置。否则,程序将运行旧的功能。

语法

它具有以下语法:

在这个语法中,

  • Inline: 它用于定义函数是内联的。它还告诉编译器将函数代码直接包含在程序中调用它的位置。
  • data_type: 它用于定义函数的返回类型。
  • function_name: 它用于定义函数名,主要用于调用函数。
  • Parameters: 它用于定义函数所采用的参数列表。

使用内联函数的简单 C++ 加法程序

让我们以一个使用 C++ 内联函数进行数字加法的例子。

示例

编译并运行

输出

Enter the Value of A: 15
Enter the Value of B: 35
Addition of 'a' and 'b' is: 50

说明

在此示例中,我们使用两个整数变量 int a 和 int b 定义了一个内联函数。接下来,它返回 a 和 b 的和。在 main() 函数中,程序要求用户输入 a 和 b 的值。之后,它调用内联函数并打印 a 和 b 的和。

为什么我们需要 C++ 中的内联函数?

在 C++ 中,内联函数的主要用途是减少函数调用开销,这有助于提高代码的执行速度。每当调用函数时,运行任务(例如移动到调用函数)需要大量时间。

如果函数的长度很小,这种开销实际上可能比函数本身的执行花费更多的时间。通过使用内联函数,编译器在编译期间尝试用函数的原始代码替换函数调用,从而消除了函数调用的要求,并在这种情况下节省了时间和内存。

在以下情况下,我们不能对函数进行内联:

  • 如果函数是递归的。
  • 如果函数包含循环,例如 for、while、do-while 循环。
  • 如果函数包含静态变量。
  • 如果函数包含 switch 或 go-to 语句

何时需要内联函数?

内联函数可用于以下场景:

  • 当需要性能时可以使用内联函数。
  • 它可以替代宏使用。
  • 我们可以在类外部使用内联函数,这样我们就可以隐藏函数的内部实现。

使用内联函数的 C++ 乘法程序

让我们以一个使用 C++ 内联函数的简单乘法示例。

示例

编译并运行

输出

The Multiplication of a and b: 40
The Multiplication of a and b: 150
The Multiplication of a and b: 300

说明

在此示例中,我们使用两个整数变量 int a 和 int b 定义了一个内联函数。接下来,它返回 a 和 b 的乘积。在 main 函数中,我们定义并初始化 a 和 b 的值。之后,它多次调用内联函数并打印输出。

类中的内联函数

在 C++ 中,类内部指定的所有成员函数都被编译器隐式地视为内联。如果我们需要将函数显式定义为内联,并且在类外部定义它,我们需要在函数定义之前使用 inline 关键字。

使用类中的内联函数计算数字平方的示例

让我们以一个使用类中的内联函数计算给定数字平方的示例。

示例

编译并运行

输出

The Square of a Number is: 100

说明

在此示例中,我们创建了一个名为 Tpoint 的类,该类将成员函数 square(int a) 声明为内联。在 main() 函数中,创建了该类的对象,并以值 10 调用 square 函数。

内联与宏的区别

C++ 中内联和宏的几个区别如下:

特点内联函数
定义它们使用 inline 关键字指定。它们使用 #define 预处理器指令指定。
扩张它们由编译器展开。它们由预处理器展开。
范围这些函数具有与普通函数相同的范围和类型检查。这些函数没有范围或类型检查。
调试它们易于调试,因为它们在编译时执行。它们难以调试,因为它们不在编译时执行。
私有成员内联函数可以访问类的私有成员。它们永远无法访问类的私有成员。
求值内联函数的所有参数都只评估一次。当宏在代码中使用时,参数会被评估多次。
错误检查在内联函数中,错误由编译器检查。在宏中,错误无法正确检测。
用途它适用于小型函数。它主要用于常量。
递归这些函数可以递归调用自身。它们不能递归。

内联函数的优缺点

C++ 中内联函数的几个优缺点如下:

优点

  • 在内联函数中,我们不需要调用函数,因此不会造成任何开销。
  • 它还节省了函数return 语句的开销。
  • 它不需要任何栈来推入或弹出变量,因为它不执行任何函数调用。
  • 内联函数适用于嵌入式系统,因为它产生的代码比普通函数少。

缺点

  • 在内联函数内部创建的变量将消耗额外的寄存器。如果变量增加,寄存器的使用也会增加,这可能会增加寄存器变量资源利用率的开销。这意味着当函数调用被内联函数体替换时,变量的数量也会增加,从而导致寄存器数量的增加。
  • 如果使用许多内联函数,二进制可执行文件也会变大。
  • 使用如此多的内联函数会降低指令缓存命中率,从而降低从缓存内存到主内存的指令获取速度。
  • 有时,内联函数对许多嵌入式系统没有用处,因为嵌入式系统的大小比速度更重要。
  • 由于二进制可执行文件大小的增加,它还可能导致颠簸。如果内存中发生颠簸,会导致计算机性能下降。

结论

总之,内联函数通过直接嵌入函数代码来加速程序,从而避免了正常的调用开销。这些函数减少了在栈上推入和弹出变量的需求,从而提高了代码执行效率。其主要目的是通过减少函数调用开销来提高程序的性能。

C++ 内联函数 MCQ

1. C++ 中用于声明内联函数的关键字是以下哪一个?

  1. in_function
  2. 内联
  3. def
  4. fast
 

答案: b) inline


2. 以下哪一项陈述正确地显示了内联函数和宏函数之间的区别?

  1. 宏在编译之前展开。
  2. 内联函数不能返回值。
  3. 宏经过类型检查。
  4. 内联函数由预处理器展开。
 

答案: a) 宏在编译之前展开


3. 以下关于 C++ 内联函数的选项中,哪一项是正确的?

  1. 它们由编译器确保内联。
  2. 它们永远不能是递归的。
  3. 它们总是减小可执行文件的大小。
  4. 它们通过避免函数调用开销来提高性能。
 

答案: d) 它们通过避免函数调用开销来提高性能。


4. 以下程序的输出是什么?

  1. 语法错误
  2. 运行时错误
  3. Hello Tpointtech World!
  4. 链接器错误
 

答案: c) Hello Tpointtech World!


5. 以下 C++ 程序的输出是什么?

  1. 语法错误
  2. Hello Tpointtech World!
  3. 逻辑错误
  4. 运行时错误
 

答案: a) 语法错误


下一主题C++ 递归