内联函数,像普通函数一样被调用,但是在调用时并不通过函数调用的机制而是编译的时候直接在调用点处展开,这样可以大大减少由函数调用带来的开销,从而提高程序的运行效率。
- 类内定义成员函数默认是内联函数
- 类外定义成员函数,若想定义为内联函数,需用关键字 inline 声明
内联函数不是在调用时发生控制转移关系(普通函数是在调用的时候控制转移),而是在编译阶段将函数体嵌入到每一个调用该函数的语句块中,编译器会将程序中出现内联函数的调用表达式用内联函数的函数体来替换。
普通函数是将程序执行转移到被调用函数所存放的内存地址,当函数执行完后,返回到执行此函数前的地方。转移操作需要保护现场,被调函数执行完后,再恢复现场,该过程需要较大的资源开销。(要把参数、返回地址压入栈)
在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。
内联函数内部不能有循环语句和switch语句。
对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。
不宜使用内联:
- (1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
- (2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。(就没必要)
对比宏定义
- 内联函数是在编译时展开,内联函数被直接嵌入到目标代码中去;而宏在编译预处理时展开,只是一个简单的文本替换(预编译处理完的还是代码文件)
- 宏定义只进行文本替换,不会对参数的类型、语句能否正常编译等进行检查(也因为只是在预编译时期,后续编译会有编译的检查);而内联函数是真正的函数,会对参数的类型、函数体内的语句编写是否正确等进行检查。
- 内联函数是真正的函数,和普通函数调用的方法一样,在调用点处直接展开,避免了函数的参数压栈操作,减少了调用的开销。而宏定义不能算是函数,编写较为复杂,常需要增加一些括号来避免歧义。(宏调用时是以实参代换形参。而不是“值传送”)
- 内联函数可以访问类的成员变量,而宏定义则不能