C++内联函数
程序员文章站
2024-03-22 19:29:58
...
概念:
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,可以提升程序运行的效率。
本质:
为了解决C语言的缺陷,C语言我们用的是宏定义来展开,宏有很大的缺陷,
宏的最主要缺陷是:没有类型检查,不可调试。所以内联函数取代宏,方便,直接在调用的地方展开,一般是小函数(15行之内的)
如果在上述函数前增加inline关键字将其改成内联函数,在编译期间的编译器会用函数体替换函数的调用,避免开辟栈帧的麻烦,提高效率
内联函数和普通函数的区别:
当编译器处理调用内联函数的语句时,不会将该语句编译成函数调用的指令,而是直接将整个函数体的代码插人调用语句处,
就是把整个函数的定义在调用的地方展开,重新写了一样。
特性
- inline是一种以空间换时间的做法,省去调用函数的开销。所以代码很长或者有递归或者多重循环的函数不适宜作为内联函数,这样会代码冗余
- inline对预编译而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环或递归等,编译器优化时会忽略掉内联。
- inline不建议声明与定义分离,分离会导致连接错误。因为inline被展开,就没有函数地址了,链接就会找不到
总结:
有了内联函数,就能像调用一个函数那样方便地重复使用一段代码,而不需要付出执行函数调用的额外开销。很显然,使用内联函数会 使最终可执行程序的体积增加**,若内联函数在程序调用次数过多(内联函数展开次数较多),或者代码过长,会导致代码冗余,可读性较差**。总之就是以时间换取空间,或增加空间消耗来节省时间。
C++中内联函数可以替代宏【面试题】
我们先来看一下宏上的优缺点:
宏的优缺点:
优点:
- 增强代码的复用性
- 提高性能,效率
缺点:
- 不方便调试宏。(因为预编译阶段进行了宏替换)
- 没有类型安全检查,可读性也较差
C++中哪些可以替代宏?
- 常量定义 换用const
- 函数定义 换用内联函数