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

退出打印视图

更新时间: 2016 年 7 月
 
 

7.4 模板系统信息库

在各次编译之间,模板系统信息库存储模板实例,以便仅在需要时编译模板实例。 模板系统信息库包含了使用 –instances=extern 选项时模板实例化所需的所有非源文件。系统信息库不用于其他种类的实例。

7.4.1 系统信息库结构

缺省情况下,模板系统信息库位于名为 SunWS_cache 的高速缓存目录中。

高速缓存目录包含在放置对象文件的目录中。可以通过设置环境变量 SUNWS_CACHE_NAME 更改高速缓存目录的名称。请注意,SUNWS_CACHE_NAME 变量值必须是目录名称,而不能是路径名。编译器会自动将模板高速缓存目录放置到对象文件目录下,因此编译器已具有路径。

7.4.2 写入模板系统信息库

编译器必须存储模板实例时,编译器将模板实例存储在对应于输出文件的模板系统信息库中。例如,以下命令将对象文件写入 ./sub/a.o 并将模板实例写入包含在 ./sub/SunWS_cache 中的系统信息库。如果高速缓存目录不存在,且编译器需要对模板进行实例化,则编译器将创建该目录。

example% CC -o sub/a.o a.cc

7.4.3 从多模板系统信息库读取

编译器从对应于编译器读取的对象文件的模板系统信息库读取。例如,以下命令从 ./sub1/SunWS_cache./sub2/SunWS_cache 进行读取,并且在必要时向 ./SunWS_cache 进行写入。

example% CC sub1/a.o sub2/b.o

7.4.4 共享模板系统信息库

系统信息库中的模板不得违反 ISO C++ 标准的一次定义规则。也就是说,使用所有的模板时模板必须具有相同的源。违反该规则会产生不可预料的行为。

确保不违反该规则的最简单和最保守的方法是在任何一个目录内仅生成一个程序或库。两个不相关的程序可以使用相同类型的名称或外部名称来表示不同的内容。如果程序共享模板系统信息库,则模板定义会出现冲突,会产生不可预料的结果。

7.4.5 通过 –instances=extern 实现模板实例自动一致

如果指定了 -instances=extern,模板系统信息库管理器可确保系统信息库中实例的状态与源文件一致且是最新的。

例如,如果您的源文件是使用 -g 选项(启用调试)编译的,则还会使用 -g 编译来自数据库中的所需文件。

此外,模板系统信息库会跟踪编译中的更改。例如,如果设置了 -DDEBUG 标志来定义名称 DEBUG,则数据库中会记录该信息。如果在以后的编译中省略该标志,则编译器重新实例化设置依赖性的这些模板。


注 - 如果删除模板的源代码或停止使用模板,模板的实例会保留在缓存中。如果更改函数模板的签名,使用旧签名的实例会保留在缓存中。如果因为这些问题在编译时或链接时遇到了异常行为,请清除模板缓存并重新生成程序。