【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; 
}
相关推荐
蜡笔小马1 分钟前
13.C++设计模式-策略模式
c++·设计模式·策略模式
我命由我123454 分钟前
Android 开发问题:TextView 内容超过宽度时,默认不会换行
android·开发语言·java-ee·android studio·android jetpack·android-studio·android runtime
计算机安禾5 分钟前
【c++面向对象编程】第36篇:析构函数应永远不抛出异常——原因与最佳实践
开发语言·c++
一条泥憨鱼8 分钟前
【Java 进阶】LinkedHashMap 与 TreeMap
java·开发语言·数据结构·笔记·后端·学习
ゆづき8 分钟前
假如编程语言们有外号
java·c语言·c++·python·学习·c#·生活
凤山老林10 分钟前
63-Java LinkedList(链表)
java·开发语言·链表
恣艺16 分钟前
用Go从零实现一个高性能KV存储引擎:B+Tree索引、WAL持久化、LRU缓存的工程实践
开发语言·数据库·redis·缓存·golang
kkeeper~9 小时前
0基础C语言积跬步之深入理解指针(5下)
c语言·开发语言
一直不明飞行9 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
REDcker9 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式