内联函数和编译器:
内联函数并不是何时何地都有效,为了理解内联函数何时有效,应该要知道编译器碰到内联
函数会怎么处理?
对于任何类型的函数,编译器会将函数类型(包括函数名字,参数类型,返回值类型)放入到
符号表中。同样,当编译器看到内联函数,并且对内联函数体进行分析没有发现错误时,也
会将内联函数放入符号表。
当调用一个内联函数的时候,编译器首先确保传入参数类型是正确匹配的,或者如果类型不
正完全匹配,但是可以将其转换为正确类型,并且返回值在目标表达式里匹配正确类型,或
者可以转换为目标类型,内联函数就会直接替换函数调用,这就消除了函数调用的开销。假
如内联函数是成员函数,对象this指针也会被放入合适位置。
类型检查和类型转换、包括在合适位置放入对象this指针这些都是预处理器不能完成的。
但是c++内联编译会有一些限制,以下情况编译器可能考虑不会将函数进行内联编译:
不能存在任何形式的循环语句
不能存在过多的条件判断语句
函数体不能过于庞大
不能对函数进行取址操作
内联仅仅只是给编译器一个建议,编译器不一定会接受这种建议,如果你没有将函数声明为
内联函数,那么编译器也可能将此函数做内联编译。一个好的编译器将会内联小的、简单的
函数。