【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; 
}
相关推荐
张忠琳几秒前
【Go 1.26.4】Golang Select 深度解析
开发语言·后端·golang
AC赳赳老秦1 小时前
OpenClaw+Power Apps 实战:自动生成 Power Apps 应用、连接 Excel 数据源
大数据·开发语言·python·serverless·excel·deepseek·openclaw
提笔了无痕1 小时前
如何用Go实现整套RAG流程
开发语言·后端·golang
(Charon)1 小时前
【C++ 面试高频基础:指针、引用、const、static、new/delete 总结】
java·开发语言
2601_961875242 小时前
法考考试时间安排及科目|时间表|资料已整理
开发语言·c#·inverted-index·suffix-tree·sstable·r-tree·lsm-tree
AI科技星2 小时前
数术工坊第八卷:算力革命
c语言·开发语言·网络·量子计算·agi
Frank学习路上2 小时前
【C++】面试:关键字与语法特性
c++·面试
geovindu2 小时前
go: Generators Pattern
开发语言·后端·设计模式·golang·生成器模式
Irissgwe3 小时前
数据结构-栈和队列
数据结构·c++·c·栈和队列
码云骑士4 小时前
13-列表append的底层真相(上)-listobject源码中的预分配策略
开发语言·python