【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; 
}
相关推荐
踩着两条虫5 小时前
「AI + 低代码」的可视化设计器
开发语言·前端·低代码·设计模式·架构
JoneBB5 小时前
ABAP Webservice连接
运维·开发语言·数据库·学习
即使再小的船也能远航6 小时前
【Python】安装
开发语言·python
Irissgwe6 小时前
类与对象(三)
开发语言·c++·类和对象·友元
️是786 小时前
信息奥赛一本通—编程启蒙(3395:练68.3 车牌问题)
数据结构·c++·算法
计算机安禾6 小时前
【c++面向对象编程】第24篇:类型转换运算符:自定义隐式转换与explicit
java·c++·算法
雪度娃娃6 小时前
转向现代C++——优先选用nullptr而不是0和NULL
开发语言·c++
我星期八休息7 小时前
Linux系统编程—基础IO
linux·运维·服务器·c语言·c++·人工智能·算法
萌新小码农‍7 小时前
python装饰器
开发语言·前端·python
KK溜了溜了7 小时前
Python从入门到精通
服务器·开发语言·python