Oracle® Developer Studio 12.5:C++ 用户指南

退出打印视图

更新时间: 2016 年 7 月
 
 

7.2 系统信息库管理

CCadmin(1) 命令管理模板系统信息库(只能与选项 -instances=extern 一起使用)。例如,程序中的更改会造成某些实例化过度,这样会浪费存储空间。CCadmin – clean 命令(以前是 ptclean)清除所有实例及关联数据。实例化仅在需要时才重新创建。

7.2.1 生成的实例

为了生成模板实例,编译器将内联模板函数看作内联函数。编译器像管理其他内联函数一样管理这些内联模板函数,另外本章中的说明不适用于模板内联函数。

7.2.2 整个类实例化

编译器通常是分别实例化各个模板类成员,因此,编译器仅实例化程序中使用的成员。仅用于调试器的方法会因此而不正常地实例化。

可使用两种策略确保调试成员可供调试器使用。

  • 首先,编写使用模板类实例成员(否则无用)的非模板函数,不需要调用该函数。

  • 其次,使用 -template=wholeclass 编译器选项,该选项指示编译器实例化模板类的所有非模板非内联成员(如果实例化这些相同成员中的任何一个)。

ISO C++ 标准允许开发者编写模板类,对于这些类,可能并不是所有成员都可以合法使用某个给定模板参数。只要非法成员未被实例化,程序就仍然完好。ISO C++ 标准库使用了这种技术。但是,-template=wholeclass 选项会实例化所有成员,因此不能用于此类使用有问题的模板参数实例化的模板类。

7.2.3 编译时实例化

实例化是 C++ 编译器从模板创建可用的函数或对象的过程。C++ 编译器使用了编译时实例化,在编译对模板的引用时强制进行实例化。

编译时实例化的优点是:

  • 调试更加简单。错误消息出现在上下文中,使得编译器可以给出到引用点的完整回溯。

  • 模板实例化始终保持最新。

  • 包括链接阶段在内的总编译时间减少了。

如果源文件位于不同的目录或您使用了具有模板符号的库,则模板可以多次实例化。

7.2.4 模板实例的放置和链接

缺省情况下,实例会进入特殊地址区域,链接程序会识别并丢弃重复项。您可以指示编译器使用五个实例放置和链接方法之一: 外部、静态、全局、显式和半显式。

  • 在下列情况下,外部实例可以达到最佳的执行效果:

    • 程序中的实例集比较小,但是每个编译单元引用了实例较大的子集。

    • 少数实例是在多于一个或两个编译单元中引用的。

    静态实例已过时

  • 缺省的全局实例适用于所有开发,并且在对象引用各种实例时可以达到最佳的执行效果。

  • 显式实例适用于某些需精确控制的应用程序编译环境。

  • 半显式实例对编译环境的控制要求较少,但是生成的对象文件较大,并且使用有限制。

本节讨论了五种实例放置和链接方法。模板实例化中提供了有关生成实例的其他信息。