Oracle Solaris Studio 12.2:C++ 用户指南

7.4 模板系统信息库

模板系统信息库中存储需单独进行编译的模板实例,以便仅在需要时编译模板实例。模板系统信息库包含了使用外部实例方法时模板实例化所需的所有非源文件。系统信息库不用于其他种类的实例。

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,数据库中会记录下该信息。如果在以后的编译中省略该标志,则编译器重新实例化设置依赖性的这些模板。


注 –

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