c++ - 如果从未调用函数,编译器会在创建程序时忽略它吗?

标签 c++ performance optimization

当编译器运行其优化时,它会忽略从未调用过的函数吗?我记得读过一些东西说不要包含不必要的文件,因为它会在程序中造成不必要的膨胀,所以我只能根据该声明假设在编译时它确实包含从未使用过的所述功能,但我没有看到任何逻辑编译器不删除它们的原因,我认为大多数现代编译器可能会删除额外的未使用函数。

最佳答案

一般来说,答案是否定的。但是有些编译器会在某些特定情况下去掉一些函数。并且链接器也不会包含源文件中不需要该文件中的函数的静态链接库中的函数。

一个通常被消除的常见情况是一个静态函数,它永远不会被调用,而且谁的地址也永远不会被占用。另一个是静态函数,它在任何被调用的地方都内联并且永远不会占用谁的地址。

这完全取决于编译器。

但是,一般来说,这很难做到,因为编译器通常无法查看整个程序来构建全面的调用图。而且链接器不够智能。

此外,一些文件可能最终成为库的一部分。图书馆的全部目的是拥有一堆不是从图书馆本身调用的代码。编译器无法在编译时确定一段给定的代码是否进入库。因此,这再次意味着对于具有“外部链接”的函数,如果不使用它们,则由链接器来删除它们。

关于c++ - 如果从未调用函数,编译器会在创建程序时忽略它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15880954/

相关文章:

java - Swing 动画闪烁并导致 GUI 响应缓慢

c++:如何优化IO?

sql-server - 使用当前值更新列

c# - 在 C# 中确定未修剪的字符串是否为空的最有效方法是什么?

c++ - C/C++ 中的正则表达式

c++ - 堆栈变量或函数声明

c++ - 对一元运算如何导致此输出感到困惑

c++ - 从用类方法编写的 lambda 函数访问类字段

performance - 通过 mov, xor 交换变量的成本

c# - Unity 容器性能优于直接数据访问 - 一个很大的区别