为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline关键字。
- 类内定义成员函数默认是内联函数
- 类外定义成员函数,若想定义为内联函数,需用关键字声明。
当在类内声明函数,在类外定义函数时,如果想将该函数定义为内联函数,则可以在类内声明时不加 inline 关键字,而在类外定义函数时加上 inline 关键字。
inline 函数工作原理
- 内联函数不是在调用时发生控制转移关系,而是在编译阶段将函数体嵌入到每一个调用该函数的语句块中,编译器会将程序中出现内联函数的调用表达式用内联函数的函数体来替换。
- 普通函数是将程序执行转移到被调用函数所存放的内存地址,当函数执行完后,返回到执行此函数前的地方。转移操作需要保护现场,被调函数执行完后,再恢复现场,该过程需要较大的资源开销。
inline函数优缺点
优点:
- inline定义的内联函数,函数代码被放入符号表中,在使用时进行替换(像宏一样展开),效率很高(主要减小了函数调用和返回的开销)。
- 类的内联函数也是函数。编绎器在调用一个内联函数,首先会检查参数问题,保证调用正确,像对待真正函数一样,消除了隐患及局限性。
- inline可以作为类的成员函数,可以用static关键字修饰。
缺点:
内联函数以复制为代价
- 如果函数的代码较长,使用内联将消耗过多内存
- 如果函数体内有循环,那么执行函数代码时间比调用开销大。
宏定义(define)和内联函数(inline)的区别
- 内联函数是在编译时展开,而宏在编译预处理时展开;在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。
- 内联函数是真正的函数,和普通函数调用的方法一样,在调用点处直接展开,避免了函数的参数压栈操作,减少了调用的开销。而宏定义编写较为复杂,常需要增加一些括号来避免歧义。
- 宏定义只进行文本替换,不会对参数的类型、语句能否正常编译等进行检查。而内联函数是真正的函数,会对参数的类型、函数体内的语句编写是否正确等进行检查。