当编译器运行其优化时,它是否会忽略从未调用过的函数?我记得读过一些说不要包含不必要的文件的东西,因为它会在程序中造成不必要的膨胀,所以我只能从该声明中假设,当它被编译时,它确实包含了从未使用过的函数,但我没有看到任何合乎逻辑的编译器不删除它们的原因,我认为大多数现代编译器可能会删除额外未使用的函数。
3 回答
一般来说,答案是“不”。但是一些编译器会在某些特定情况下消除一些功能。并且链接器也不会包含来自源文件中不需要该文件中的函数的静态链接库中的函数。
通常消除的一种常见情况是从不调用的静态函数,并且从不获取谁的地址。另一个是静态函数,它在被调用的任何地方都内联,并且永远不会占用谁的地址。
这完全取决于编译器。
但是,一般来说,这很难做到,因为编译器通常没有整个程序的视图来构建一个全面的调用图。而且链接器不够聪明。
此外,某些文件可能最终成为库的一部分。库的全部目的是拥有一堆不从库本身调用的代码。编译器无法在编译时确定给定的代码段是否进入库。再说一次,这意味着对于具有“外部链接”的函数,如果不使用它们,则由链接器来忽略它们。
它在很大程度上取决于编译器,但是是的,在某些设置中,编译器可以完全消除未调用的函数。编译器必须确保该函数确实从未被调用。
特别是标记的功能static
可以很容易地消除 - 只需查看同一个翻译单元。如果一个函数可能被另一个翻译单元调用,那就更难了。Visual C++ 对此有一个特殊的设置,称为“函数级链接”和一个用于删除未引用函数的链接器设置。当这两个一起使用时,未引用的函数将被完全消除。
它可以做到。C++ 编译器仅在as-if规则下运行。只要生成的程序按照标准要求运行,编译器就可以为所欲为。
需要符合要求的实现来模拟(仅)抽象机器的可观察行为
如果函数从未被调用,那么编译器当然可以摆脱它,但它是否完全取决于编译器。但是,C++ 的编译模型需要单独编译翻译单元。编译器通常不可能或很难知道该函数从未从任何其他翻译单元调用。