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

C++ 编译器会排除未使用的模板代码吗?,c++,compiler-construction,C++,Compiler Construction,当您使用包含许多方法(如vector)的模板并编译代码时,编译器是否会丢弃未使用方法中的代码?这取决于您的优化级别。在更高的优化设置下,很可能会发生死代码消除。编译器、优化器和链接器可以省略和/或减少该信息。每个成熟的工具可能都有特定于消除死代码的选项 有了模板,代码可能一开始就无法真正创建(除非实例化) 当然,并不是所有这些都会在每个场景中被删除,但是(rtti是一个无声的杀手)。稍微谨慎一点,使用构建设置进行测试可以大大帮助您减少二进制大小和死代码。智能编译器很可能会将其排除在外。很久以前,

当您使用包含许多方法(如vector)的模板并编译代码时,编译器是否会丢弃未使用方法中的代码?

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

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

有了模板,代码可能一开始就无法真正创建(除非实例化)


当然,并不是所有这些都会在每个场景中被删除,但是(rtti是一个无声的杀手)。稍微谨慎一点,使用构建设置进行测试可以大大帮助您减少二进制大小和死代码。

智能编译器很可能会将其排除在外。很久以前,当我使用Borland C++ + Builder时,我认为它并没有抛出未使用的模板类方法。无法确认,但除非使用模板,否则模板不会实例化,因此实际上没有要丢弃的代码

标准规定(14.7.1/10)

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


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

这取决于很多因素:特定的编译器/链接器、优化级别、是否编译可执行文件/库/DLL,等等,我们是否应该假设“未使用的方法”是指在源代码中从未调用过的方法?或者我们假设您正在寻找在程序生命周期中从未调用过的函数?请注意,类模板的成员函数在使用之前实际上不会被编译。(只有第一个过程发生,第二个过程在使用时发生。)@GManNickG这是什么意思?@DennisMeng源代码中从未调用过的方法。