2

我在遗留代码中有一个函数,不再被调用。

我的问题是:编译器会针对未被调用的函数进行优化,还是可执行文件包含该函数的代码?

4

4 回答 4

3

可能。它是实现、工具集和构建参数定义的。

更改优化设置、链接器标志和可见性(静态/私有/外部/内部/匿名命名空间)可能会增加最终可执行文件中省略它的可能性。

于 2012-08-20T07:02:47.747 回答
0

死代码删除通常由链接器完成(因为编译器不知道使用或不使用哪些函数)。但是,有时编译器本身可以删除具有static链接的函数。

这是因为默认情况下所有函数都有外部链接。在声明外部链接变量时使用的保留术语“extern”可以(实际上是)在声明函数时省略。因此,如果那些没有声明为静态的,那么它们可以在其他地方使用,而编译器对此一无所知。

此外,GCC(如果您正在使用的话)具有 SSA 积极的死代码消除(-fssa-dce 标志),可以帮助删除不需要的代码。

如果您正在寻找删除死函数或部分的东西,那么您可以使用 gcov http://gcc.gnu.org/onlinedocs/gcc/Gcov-Intro.html#Gcov-Intro

于 2012-08-20T07:04:07.453 回答
0

如果它被编译成目标文件,那么编译器不知道你的函数是否会被使用。除非您使用链接时间优化 (lto) 或整个程序优化选项。如果函数在标头中-您可以将其设为静态,以便编译器可以对其进行优化。

于 2012-08-20T07:04:46.460 回答
0

它很有可能在文件中,因为可以通过动态方式进行运行时访问。例如一个串联的字符串会产生大量不同的函数名并用于访问它们。

尽管这种类型的实现很少见,但仍有可能,因此代码必须保持可用。

于 2012-08-20T07:08:34.507 回答