4.3.2 外联的(outlined)inline
那些希望减少用户代码数量的程序库设计者应该谨慎地杜绝外联的inline(指内联失败导致的结果)。记得inline关键字只是一个用于C++(www.cppentry.com)编译器的标志。当前所有的C++(www.cppentry.com)编辑器对其能够内联的函数都是有限制的。例如,某个编译器可能不能内联(inline)任何包含goto语句的函数,或者任何超过15行语句的函数;某些函数调用也是不能内联的-例如,不能内联具有递归调用的函数。我们将在下面的4.4.2节看到:大多数编译器甚至不能内联最简单的虚函数,因为当通过某个对象调用这个虚函数的时候,我们很难静态地决定这个对象的实际类型。
如果函数f被声明为内联函数,但未能在翻译单元每个调用的地方都对f进行内联扩展,那么在这些翻译单元中,许多编译器将会通过内部链接创建一份外联f函数的拷贝。如果在n个翻译单元中都创建了这样的外联拷贝,那么可执行文件将会包含n份f函数的拷贝。因此,如果程序员没有对内联函数的声明持小心谨慎的态度,那么代码的数量将会由于外联的inline而变得异常庞大。
让人觉得奇怪的是:某些具有优化功能的编译器,都很难断定某个重要函数是否需要内联。只有那些相当好的编译器,才能充分考虑函数被调用位置的上下文-而不是只局限于函数的复杂度-来判定所给函数调用是否需要内联。
程序库设计者可以使用的一个安全的方法就是:如果存在程序库用户编译器会在典型的调用位置外联f函数的可能性,那么我们就不应该把f函数声明为内联函数。而且,一个好的C++(www.cppentry.com)程序库的附加文档也会随同给出:在哪些情况下,编译器不会内联函数。