内联函数概念
什么是内敛函数
以inline修饰的函数叫内联函数,编译时c++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。
内联函数的作用
为什么要使用内敛函数
在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
为了解决这个问题,c++特别的引入了inline修饰符,在编译器编译代码时,直接将内联函数展开,没有了函数压栈的开销,提高程序运行的效率
使用内联和不使用在编译时的区别:
内敛函数的使用
注意事项
1.适用于短小的频繁调用的函数
2.inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜 使用作为内联函数。
3.inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等 等,编译器优化时会忽略掉内联
4.inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到,所以若是多文件,就必须定义在头文件中
5.定义在类中的成员函数缺省都是内联的,如果在类定义时就在类内给出函数定义,那当然最好。
如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的。
慎用inline
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
小结
内联函数只有当函数非常短小的时候它才能得到我们想要的效果;但是,如果函数并不是很短而且在很多地方都被调用的话,那么将会使得可执行体的体积增大。并且编译器还经常会拒绝我们的内敛申请。所以那些地方要使用内敛,需要我们的经验来判断。
【面试题】
宏的优缺点?
优点:
1.增强代码的复用性。
2.提高性能。
缺点:
1.不方便调试宏。(因为预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查 。
C++有哪些技术替代宏?
1. 常量定义 换用const 2. 函数定义 换用内联函数