编译模板实例化

如果头文件中共有模板的定义,而且该头文件被多处包含,就会为该模板创建多个编译好的副本。这样做当然可行,但在含有多个模板的大程序中,所有目标文件都会包含每个编译好的模板副本,这样会令编译时间变得很长,而且目标文件很大,

下面是一些可选的方案:

1、在源文件中,使用指示字#pragma  interface 和#pragma implementation,就只会创建一个编译后的模板。

2、与使用两个prama相似,使用命令行选项-falt-external-templates编译所有源文件。这会告诉编译器只有在真正用到模块的时候才将编译后的模板实例包含进来。这种方法的一个重要特征,就是要对每个用到头文件的模块,头文件都必须相同。

3、用命令行选项-frepo编译代码,这样创建的文件后缀为.rpo,每个.rpo 文件都列出了对应目标文件中的模板实例。然后会激活连接打包工具collect2更新.rpo文件,指示连接程序替换最后程序中的模板实例。这种方法唯一只在处理库的时候才有困难---除非相关的.rpo文件都存在,否则连接库中的模板实例就会失败。

4、用-fno-implicit-templates编译代码,会令隐式的模板实例化失效,他会显示的初始化所需模板。虽然这种方法需要精确了解正在使用的是哪种模板实例,但这种方法确实令源代码更加清楚。

原文地址:https://www.cnblogs.com/lobsterIT/p/5654330.html