编译器是否会排除未使用的模板代码

Will the compiler exclude unused template code?

本文关键字:代码 未使用 是否 排除 编译器      更新时间:2023-10-16

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

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

标准说(14.7.1/10)

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

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

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

编译器

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

使用模板,代码可能一开始就没有真正创建(除非实例化)。

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

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