CCadmin(1) 命令管理模板系统信息库(只能与选项 -instances=extern 一起使用)。例如,程序中的更改会造成某些实例化过度,这样会浪费存储空间。CCadmin – clean 命令(以前是 ptclean)清除所有实例及关联数据。实例化仅在需要时才重新创建。
为了生成模板实例,编译器将内联模板函数看作内联函数。编译器像管理其他内联函数一样管理这些内联模板函数,另外本章中的说明不适用于模板内联函数。
编译器通常是分别实例化各个模板类成员,因此,编译器仅实例化程序中使用的成员。仅用于调试器的方法会因此而不正常地实例化。
有两种方法确保调试成员可用于调试器。
首先,编写使用模板类实例成员(否则无用)的非模板函数,不需要调用该函数。
其次,使用 -template=wholeclass 编译器选项,该选项指示编译器实例化模板类的所有非模板非内联成员(如果实例化这些相同成员中的任何一个)。
ISO C++ 标准允许开发人员编写模板类,因为并不是所有成员都可以使用模板参数。只要非法成员未被实例化,程序就仍然完好。ISO C++ 标准库使用了这种技术。但是,-template=wholeclass 选项会实例化所有成员,因此不能用于此类使用有问题的模板参数实例化的模板类。
实例化是 C++ 编译器从模板创建可用的函数或对象的过程。C++ 编译器使用了编译时实例化,在编译对模板的引用时强制进行实例化。
编译时实例化的优点是:
调试更加简单-错误消息在上下文中出现,从而让编译器完全回溯到引用点。
模板实例化始终保持最新。
包括链接阶段在内的总编译时间减少了。
如果源文件位于不同的目录或您使用了具有模板符号的库,则模板可以多次实例化。
缺省情况下,实例会进入特殊地址区域,链接程序会识别并丢弃重复项。您可以指示编译器使用五个实例放置和链接方法之一:外部、静态、全局、显式和半显式。
本节讨论了五种实例放置和链接方法。6.3 模板实例化中提供了有关生成实例的其他信息。