C++之内联函数

2021年3月20日 367点热度 0人点赞 0条评论

C++中引入内联函数的目的是为了提高程序运行速度而做的一项改进。

内联函数与常规函数之间的区别也不在编写方式,而在于C++编译器是怎么将他们组合到程序中的。为了更深层次的理解,我们需要首先了解一下函数代码是怎么发挥作用的。

代码要发挥作用,最终是要转化为可执行程序,也就是一组机器语言指令。在运行程序时,操作系统将这些指令加载到计算机内存中,从而实现了相关的功能。因此,每一条指令都必须有特定的内存地址。计算机将逐步执行这些指令。而存在函数调用的时候,将会使程序跳到另一个地址(函数的地址),并且在函数结束的时候返回。我们更详细地解释一下里面的步骤。

执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并且将函数参数复制到堆栈,跳转到标记函数起点的内存单元,执行函数代码,然后返回到地址被保存的指令处。

在使用函数的时候,来回跳转并且记录跳转位置会带来一定的开销。因而,引入了内联函数。

内联函数在编译的时候将使用相应的函数代码来替换函数调用。这样一来,程序就不用跳转到另一个位置去执行函数代码了(因为你已经有副本了嘛)。所以,运用内联函数会带来运行速度的提升。

然而,执行速度的提升并非没有代价的:

  1. 内联函数的使用会带来“代码膨胀”的问题,也需要占用更多的内存;
  2. 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。

所以,我们要分情况来决定要不要使用内联函数。

如果,

  • 如果函数体内的代码比较长,使得内联将导致内存消耗代价比较高;
  • 如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大;
    那么就不宜使用内联函数。

要使用这项特性,必须采取下述措施之一:

  • 在函数声明前加关键字inline;
  • 在函数定义前加关键字inline;

示例:

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

agedcat_xuanzai

这个人很懒,什么都没留下

文章评论