高质量程序设计指南c++/c语言(8)--内联函数
宏替换发生在编译预处理阶段,使用宏可以加快执行速度,但是宏有一些缺点
(1)容易出错,预处理器在复制宏代码时常常产生想不到的边际效应
(2)另一个缺点是不能调试,但是内联函数是可以调试的。内联函数不是也像宏一样进行代码展开吗?怎么能调试呢?其实内联函数的可调试不是说它展开后还能调试,而是在程序的调试版本里它根本没有实现内联。在发行版里,编译器才会实施真正的内联。
内联发生在编译阶段,对任何内联函数,编译器在符号表里放入函数的声明,包括名字、参数、返回值类型(符号表是编译器用来收集和保存字面常量和某些符号常量的地方)。如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。在调用一个内联函数时,编译器首先检查调用是否正确(进行类型安全检查,或者进行自动类型转换,当然对所有的函数都是一样的)。如果正确,内联函数的代码就会直接替换函数调用语句,于是省去了函数调用的开销。内联机制既具备宏代码的效率,又增加了安全性。
关键字inline必须与函数定义体放在一起才能使函数成为真正的内联,仅仅把inline放在函数声明的前面不起任何作用。