【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; 
}
相关推荐
我材不敲代码2 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
身如柳絮随风扬3 小时前
Java中的CAS机制详解
java·开发语言
-dzk-4 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
韩立学长4 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
froginwe115 小时前
Scala 循环
开发语言
m0_706653235 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你915 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Bruk.Liu5 小时前
(LangChain实战2):LangChain消息(message)的使用
开发语言·langchain
qq_423233905 小时前
C++与Python混合编程实战
开发语言·c++·算法
m0_715575346 小时前
分布式任务调度系统
开发语言·c++·算法