编译器是否会排除未使用的模板代码
Will the compiler exclude unused template code?
当您使用具有多种方法(如vector)的模板并编译代码时,编译器会丢弃未使用的方法中的代码吗?
除非使用模板,否则不会实例化模板,因此实际上没有代码可以丢弃。
标准说(14.7.1/10)
实现不应隐式实例化不需要实例化的函数模板、成员模板、非虚拟成员函数、成员类或类模板的静态数据成员。如果虚拟成员函数不会被实例化,则不指定实现是否隐式实例化类模板的虚拟成员函数。在默认参数中使用模板专用化不会导致模板被隐式实例化,除非类模板可能需要其完整类型来确定默认参数的正确性。在函数调用中使用默认参数会导致隐式实例化默认参数中的专用化。
因此,如果可以避免使模板的成员函数成为虚拟函数,编译器将不会为它们生成任何代码(如果编译器足够智能,这可能也适用于虚函数)。
这取决于您的优化级别。在更高的优化设置下,是的,很可能会消除死代码。
编译器
、优化器和链接器可以省略和/或减少该信息。 每个成熟的工具都可能有特定于死代码消除的选项。
使用模板,代码可能一开始就没有真正创建(除非实例化)。
当然,并非所有内容都会在每种情况下都被删除(RTTI是一个无声的杀手)。 使用构建设置进行一些谨慎和测试可以大大帮助您减少二进制大小和死代码。
智能编译器很可能会排除它。很久以前,当我玩Borland C++ Builder时,我认为它并没有抛弃未使用的模板类方法。虽然无法确认
相关文章:
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- C++代码中奇怪的未使用的静态字符串声明
- 来自重载或模板化函数的额外未使用代码的影响?
- 在编译期间包含未使用的代码
- 我可以在将项目编译为静态库(未定义的引用)时在代码中使用 QImage 吗?
- 用于 JUnit 测试的本机代码未使用 'nar-maven-plugin' 编译
- 如果 LTO 中的代码依赖于其构造的副作用,是否允许 LTO 删除未使用的全局对象?
- 我如何才能找到C 代码以找到所有未使用的返回值
- gcc 什么时候编译未使用的模板代码?
- C++Visual Studio Release生成未使用的代码崩溃
- 将未使用的元素添加到C/C 结构加快并减慢代码执行
- 进度条未使用C++代码和GTK+进行更新
- 编译器是否会排除未使用的模板代码
- qt-creator 中有没有办法检查未使用/死的代码
- 在导致未定义符号错误的示例代码上使用 Boost 库
- 调试代码并C++未使用的参数警告
- 未使用调试器标志编译的代码出现分段错误
- 是否有任何工具/方法来检测/删除所有未使用的变量,宏,头(包括)和函数从c++代码
- 试图使用typeid时,代码未编译
- 未使用代码中的开销