【C++】详解inline

2023年8月28日,周一晚上


目录


优点

当使用inline关键字声明一个函数时,编译器会将函数体内联到所有调用该函数的地方。

这可以提高执行效率,因为无需进行函数调用的开销。

缺点

但是,过度使用内联函数也有不利影响:

  1. 可执行文件大小增加。因为函数体被复制到每个调用点,所以可执行文件变大。
  2. 编译时间增加。编译器需要处理更多的代码,所以编译时间增加。
  3. 优化机会减少。由于函数体被分散到多个地方,编译器较难进行优化。

使用条件

inline关键字应该谨慎使用,只对小函数使用内联是明智的选择。

一般来说,满足以下条件的函数是适合内联的:

  1. 函数体较小(通常不超过10行)。
  2. 函数被频繁调用(调用开销比较大)。
  3. 函数不会递归调用自己。
  4. 函数体不包含循环、跳转等复杂控制流结构。

为什么调用函数会有开销

函数调用会产生一定的开销,主要包括:

  1. 调用指令。调用一个函数需要使用调用指令,比如call指令。这个调用指令会使程序跳转到函数体,并在返回时跳回调用点。这个跳转操作需要处理器时间和内存空间,产生开销。

  2. 参数传递。向函数传递参数也需要时间和空间,需要将实际参数值复制给形式参数,或者将实际参数的地址传递给形式参数。

  3. 返回地址存放。函数调用后,返回地址需要被存放以便函数返回。返回地址的存放也需要栈空间,产生开销。

  4. 寄存器保存。函数调用前,需要将相关寄存器的值保存到栈中,以防函数体修改它们。保存和恢复寄存器的值也需要时间和空间。

  5. 上下文切换。函数调用需要在当前函数的上下文和被调用函数的上下文之间切换,这个切换操作也会产生开销。

这些开销虽然对单次函数调用来说比较小,但是对于一个函数如果被频繁调用,这些开销就会积累起来,影响程序的执行效率。

总之,函数调用产生开销的原因在于调用指令、参数传递、返回地址存放、寄存器保存和上下文切换等方面所需要的时间和空间。使用inline关键字内联函数可以减少这些开销,提高效率。

举例说明

cpp 复制代码
inline int add(int a, int b) { 
  return a + b; 
}

int main() {
  int sum = add(1, 2);
  // 这里,add()函数的函数体被内联,等价于:
  // int sum = 1 + 2; 
  // 函数调用开销被省略。
  return 0; 
}
相关推荐
懂点Tech14 小时前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
云和数据.ChenGuang14 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
美狐美颜SDK开放平台15 小时前
视频美颜SDK试用DEMO阶段应该测试什么?直播APP接入实操指南
开发语言·人工智能·深度学习·音视频·美颜sdk·直播美颜sdk·第三方美颜sdk
dtq042415 小时前
C++小案例 - 日志实战
开发语言·c++
星夜离尘5616 小时前
MATLAB ADC 码流触顶诊断:命中数、缺口分段与削顶不可辨识性
开发语言·matlab
码匠许师傅16 小时前
【C++三方组件】Qt 概览:桌面 C++ 的事实标准与许可证三轨
开发语言·c++·qt
码匠许师傅17 小时前
【C++三方组件】POCO:跨平台系统编程全家桶
开发语言·c++
bkspiderx18 小时前
基于Socket的广播通信及C语言实现详解
c语言·开发语言·socket·广播·socket的广播通信
小王C语言18 小时前
Qt常用控件:输入类控件,单行/多行输入框、下拉框、(日期)微调框、旋钮、滑动条
开发语言·qt
ESDWAN18 小时前
SD-WAN 主备切换为什么仍然会断网?从检测机制到会话恢复分析
开发语言·php