编译器会排除未使用的模板代码吗?

时间:2012-08-09 19:56:01

标签: c++ compiler-construction

当您使用具有多种方法的模板(如vector)并编译代码时,编译器会丢弃未使用方法中的代码吗?

4 个答案:

答案 0 :(得分:6)

除非使用模板,否则不会实例化模板,因此实际上没有要丢弃的代码。

标准说(14.7.1 / 10)

  

实现不应隐式实例化不需要实例化的类模板的函数模板,成员模板,非虚拟成员函数,成员类或静态数据成员。如果虚拟成员函数不会被实例化,则实现是否隐式实例化类模板的虚拟成员函数是未指定的。在默认参数中使用模板特化不应导致模板被隐式实例化,除了可以实例化类模板,其中需要其完整类型来确定默认参数的正确性。在函数调用中使用默认参数会导致默认参数中的特殊化被隐式实例化。

因此,如果您可以避免将模板的成员函数设置为虚拟,那么编译器将不会为它们生成任何代码(如果编译器足够智能,那么它也可能适用于虚函数)。

答案 1 :(得分:4)

这取决于您的优化级别。在更高的优化设置下,是的,很可能会发生死代码消除。

答案 2 :(得分:1)

编译器,优化器和链接器可以省略和/或减少该信息。每个成熟工具都可能具有特定于死代码消除的选项。

使用模板,代码可能不会真正创建(除非实例化)。

当然,并不是所有情况都会被删除,但是(rtti是一个沉默的杀手)。使用构建设置进行一些谨慎和测试可以帮助您减少二进制大小和死代码。

答案 3 :(得分:0)

智能编译器最有可能将其排除在外。很久以前,当我玩Borland C ++ Builder时,我认为它没有丢弃未使用的模板类方法。无法确认