6

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

4

4 回答 4

6

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

标准说 (14.7.1/10)

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

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

于 2012-08-09T21:05:23.633 回答
4

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

于 2012-08-09T19:58:44.393 回答
1

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

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

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

于 2012-08-09T19:58:59.163 回答
0

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

于 2012-08-09T20:01:21.480 回答