内联函数与宏
内联函数有什么作用?存不存在什么缺点?
- 首先在程序运行过程中调用一个函数时,需要先将当前状态保存,将参数入栈,函数结束后出栈,恢复状态等等开销,而内联函数的作用就是节省这些开销。
- 内联函数就是让编译器在函数调用的地方,直接将函数的代码展开,就地计算,而不是开辟栈空间调用函数,这样就可以避免函数调用的开销,但是内联函数会在每一个函数调用的地方都展开,这样也就会有很多的代码冗余,也就是会造成代码膨胀,尤其是递归的函数,会有大量内存的开销,本质上就是一个用空间换时间的手段。
- 但是实际上我们在函数前的inline声明也只是对编译器的建议,编译器会自己判断函数是否复杂是否应该内联,甚至其实类中的成员函数都是默认内联的,只有在类外定义才需要我们加上inline,借侯捷老师的话就是,直接在每个函数前面都加上inline,把是否内联的问题交给编译器来解决。
内联函数和宏有什么区别,有了宏为什么还需要内联函数?
- 宏是在预处理阶段对命令进行替换,而内联函数是在编译阶段在调用点展开
- 也就是说宏命令是不会进行类型检查的,可能会出现类型安全问题,而内联函数会进行类型检查。