分享

8.1 C++内联函数

 Cui_home 2023-05-04 发布于河南

有别于C语言,C++新特性包括内联函数、按引用传递变量、默认的参数值、函数重载(多态)以及模板函数

1. 内联函数是C++为提高程序运行速度而改进的。

2. 常规函数和内联函数的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中

  • 程序代码先编译后运行。

    编译过程的最终产品是可执行程序,它是由一组机器语言指令组成的。

    ② 运行程序时,操作系统将这些指令载入到计算机内存中。因此,每条指令都有特定的内存地址。计算机随后将逐步执行这些命令。当遇到循环或分支语句时,将跳过一些指令,向前或向后跳到特定地址。常规函数调用也使程序跳到调用函数的地址,并在函数结束时返回。

  • 常规函数的运行过程:执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,然后跳回到地址被保存的指令处。来回跳跃并记录跳跃位置意味着使用常规函数时,需要一定的开销

  • 内联函数:无需跳转,速度较快。

    ① 内联函数使用内联代码替换函数调用。对于内联代码,程序无需跳到另一位置处执行代码,再跳回来。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存

    应有选择性地使用内联函数。若执行函数所需时间长于处理函数调用,则使用内联函数节省的时间很少;若执行函数所需时间很短,则使用内联函数会节省大部分时间。另一方面,由于这个过程相当快,因此尽管节省了该过程的大部分时间,但节省的时间绝对值并不大。除非该函数经常被调用

图8.1 内联函数与常规函数

3. 使用内联函数

  • 遵循下述规则之一:

    ① 在函数声明前加上关键字inline;② 在函数定义前加上关键字inline。

  • 通常的做法是省略原型,将整个定义放在本应提供原型的地方

  • 使用内联函数时应避免函数过大。当函数过大时,编译器可能不会将函数视为内联函数。

  • 内联函数不能递归

4. 通过内联函数 square() 来计算参数的平方。

#include <iostream>

using namespace std;

inline double square(double x) {return x * x;}

int main(void)
{
        double a, b;
        double c = 13.0;

        a = square(5.0);
        b = square(4.5 + 7.5);

        cout << "a = " << a << ", b = " << b << endl;
        cout << "c = " << c << ", c square = " << square(c++) << endl;
        cout << "Now, c = " << c << endl;

        return 0;
}

编译输出:

a = 25, b = 144
c = 13, c square = 169
Now, c = 14
  • 内联函数和常规函数一样,也是按值传递参数。如果参数为表达式,则函数将传递表达式的值。

5. C语言使用预处理器语句#define来提供宏

  • 宏不能按值传递。

  • 如果使用了C语言的宏功能,应考虑将它们转换为C++内联函数。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多