如果从未调用函数,编译器在创建程序时是否省略它?

use*_*850 3 c++ optimization performance

当编译器运行其优化时,它是否省略了从未调用过的函数?我记得读过一些不包含不必要文件的内容,因为它会在程序中造成不必要的膨胀,所以我只能从该语句中假设它在编译时确实包含了从未使用的所述函数,但我认为没有任何逻辑编译器不删除它们的原因我认为大多数现代编译器可能会删除额外的未使用函数.

Omn*_*ous 6

一般来说,答案是'不'.但是某些编译器会在某些特定情况下消除某些功能.并且链接器也不包括源文件中静态链接库的函数,其中不需要该文件中的函数.

通常被消除的一个常见情况是永远不会被调用的静态函数,并且从不采用谁的地址.另一个是静态函数,它在所有被调用的地方内联,并且从不采用谁的地址.

这完全取决于编译器.

但是,一般来说,这很难做到,因为编译器通常没有整个程序的视图来构建一个全面的调用图.并且链接器不够智能.

此外,某些文件可能最终成为库的一部分.并且库的整个目的是拥有一堆未从库本身调用的代码.编译器无法在编译时确定给定的代码段是否进入库.所以,这意味着对于具有"外部链接"的函数,如果不使用它们,则由链接器决定是否使用它们.


sha*_*oth 4

这在很大程度上取决于编译器,但是,在某些设置中,编译器可以完全消除未调用的函数。编译器必须确保该函数确实从未被调用。

具体来说,标记的函数static可以很容易地消除 - 只需查看相同的翻译单元即可。如果一个函数可能从另一个翻译单元调用,事情就会变得更加困难。Visual C++ 为此有一个特殊的设置,称为“函数级链接”和用于删除未引用函数的链接器设置。当这两个一起使用时,未引用的函数将被完全消除。