对于外部实例方法,所有实例都放置在模板系统信息库中。编译器确保只有一个一致的模板实例存在;这些实例既不是未定义的也不是多重定义的。模板仅在需要时才重新实例化。对于非调试代码,所有对象文件(包括模板缓存中的任何对象文件)在使用 -instances=extern 时的大小总量小于在使用 -instances=global 时的大小总量。
模板实例接受系统信息库中的全局链接。实例是使用外部链接从当前编译单元引用的。
这种方法的缺点是每当您更改程序或进行重大程序更改时都必须清除高速缓存。高速缓存是并行编译的瓶颈,这与使用 dmake 时一样,因为每次只能有一个编译访问高速缓存。另外,您只能在每个目录内生成一个程序。
与在主对象文件中直接创建有效模板实例并在以后丢弃该实例(如果需要)相比,确定某个有效实例是否已在高速缓存中可能需要更长的时间。
使用 –instances=extern 选项指定外部链接。
因为实例存储在模板系统信息库中,所以必须使用 CC 命令将使用外部实例的 C++ 对象链接到程序中。
如果要创建包含了使用的所有模板实例的库,请使用 -xar 选项进行编译。而不要使用 ar 命令。例如:
example% CC -xar -instances=extern -o libmain.a a.o b.o c.o