是否实例化了不必要/未使用的模板?

时间:2015-01-05 10:10:07

标签: c++ performance templates template-specialization

我有一个函数void f<int N>()。仅使用模板参数1和2调用f,例如f<1>()f<2>()我对这两个参数有效地专门f。永远不会使用任何其他参数调用f,但我已将[{1}}定义为通用f,仅用于&#34;清晰度&#34;。问题:编译器是否仍会实例化N这个未使用的定义?如果是这样,我觉得这会产生代码膨胀,因为我有很多这类函数位于非常高性能 - 该计划的关键领域。

(相反,我考虑评论f<N>()定义并将其替换为空定义,即f<N>()。)

1 个答案:

答案 0 :(得分:1)

除非使用模板,否则不会实例化模板。

来自标准:

§14.7.1/ 10

  

实现不应隐式实例化函数   模板,成员模板,非虚拟成员函数,成员   class,或类模板的静态数据成员   需要实例化。没有具体说明是否   实现隐式实例化一个虚拟成员函数   如果虚拟成员函数不存在,则为类模板   实例化。在默认情况下使用模板特化   参数不应导致模板被隐式实例化   除了可以在完整的情况下实例化类模板   需要type来确定默认参数的正确性。   在函数调用中使用默认参数会导致   默认参数中的特化要隐式实例化。