JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C++ 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分C++ 编译器

1.  C++ 编译器

2.  使用 C++ 编译器

3.  使用 C++ 编译器选项

第 2 部分编写 C++ 程序

4.  语言扩展

5.  程序组织

6.  创建和使用模板

7.  编译模板

7.1 详细编译

7.2 系统信息库管理

7.2.1 生成的实例

7.2.2 整个类实例化

7.2.3 编译时实例化

7.2.4 模板实例的放置和链接

7.3 外部实例

7.3.1 可能的高速缓存冲突

7.3.2 静态实例

7.3.3 全局实例

7.3.4 显式实例

7.3.5 半显式实例

7.4 模板系统信息库

7.4.1 系统信息库结构

7.4.2 写入模板系统信息库

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

7.4.4 共享模板系统信息库

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

7.5 模板定义搜索

7.5.1 源文件位置约定

7.5.2 定义搜索路径

7.5.3 诊断有问题的搜索

8.  异常处理

9.  改善程序性能

10.  生成多线程程序

第 3 部分库

11.  使用库

12.  使用 C++ 标准库

13.  使用传统 iostream

14.  生成库

第 4 部分附录

A.  C++ 编译器选项

B.  Pragma

词汇表

索引

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


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