C++函数——内联函数
C++内联函数 Inline Functions
内联函数和常规函数的区别
内联函数是C++为提高程序运行速度所做的一项改进。C++中的内联函数提供了一种告诉编译器尝试在每个调用点展开函数体的方法,以减少函数调用的开销。
具体如图:
什么时候使用内联函数更合适
-
小型函数:如果函数体非常小(如只有几行代码),使用内联函数可以减少函数调用的开销。
-
频繁调用的函数:对于在代码中频繁调用的函数,内联可以减少调用成本,提高程序效率。
-
包含循环的函数:如果函数内部包含循环,且循环体非常小,可以考虑内联。
-
包装器函数:对于仅仅是调用另一个函数的包装器(wrapper)函数,内联是有益的。
-
递归函数中慎用
:对于递归函数,内联应谨慎使用,因为每次递归调用都会展开,可能导致大量的代码膨胀。 -
大型函数不合适
:大型函数不适合内联,因为这会导致代码膨胀,增加缓存压力。 -
复杂控制结构不合适
:包含复杂控制结构(如多重循环和条件判断)的函数,不应该内联,因为它们可能不会带来性能提升。 -
IO操作或持续时间较长的操作不合适
:执行文件操作或网络通信等耗时操作的函数,不应内联,因为函数调用的开销与操作本身的开销相比非常小。 -
虚函数不合适
:虚函数通常不适合内联,因为它们的调用是动态的,编译时通常不可能知道将调用哪个函数。
怎样将函数变为内联函数
- 在函数声明前加上 inline 关键字、在函数定义前加上 inline 关键字。
- 类成员函数在类定义内实现时默认为内联函数。
注意,inline 是一个请求而不是命令,编译器可以选择忽略这个请求。即使一个函数被声明为 inline,编译器也可能因为各种原因(如函数体太大或包含复杂的控制流)决定不内联该函数。现代编译器还有自己的启发式方法和优化策略,可以在没有程序员指示的情况下自动内联函数。
内联函数Inline Functions
与宏Macros
宏是由预处理器处理的文本替换工具,而不是由编译器编译的函数。
宏不进行类型检查,它们简单地复制和粘贴代码。
总结:
如果是使用类似于 #define PI 3.14159
这种代码,使用宏可能比较有用。
如果使用宏执行了类似函数的功能,应该考虑将他们转换为C++内联函数。
当可能的时候,应该使用内联函数来替代宏