许多模板功能是足够小,有效地串联,所以你做得到二元线性增长-但它是没有比你更会用同等的非模板函数得到.
一个定义规则在这里很重要,因为它允许编译器假设具有相同模板参数的任何模板实例化生成相同的代码.如果它检测到模板函数早先已在源文件中实例化,则它可以使用该副本而不是生成新副本.名称修改使链接器可以从不同的编译源识别相同的函数.这些都不能保证,因为您的程序不能区分函数的相同副本之间的区别,但编译器每天都会做比这更难的优化.
需要过滤重复的一次是当函数包含静态变量时 - 只能有一个副本.但这可以通过过滤掉重复的函数或过滤掉静态变量本身来实现.
有多种因素会导致多个实例化对exacutable大小没有太大的危害:
也就是说,在可能的情况下,它会预先实例化模板,特别是如果通常只使用少量的瞬时.一个很好的例子是IOStreams库,它不太可能与超过4种类型一起使用(通常它只与一个一起使用):将模板定义及其实例化移动到单独的转换单元中可能不会减少可执行文件的大小,但肯定会减少编译时间!从C++ 11开始,可以声明模板实例化extern
,允许定义可见,而不会在已知在其他地方实例化的特化上进行隐式实例化.