非调用函数的编译器优化

时间:2012-08-20 06:58:47

标签: c++ compiler-optimization legacy

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

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

4 个答案:

答案 0 :(得分:3)

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

更改优化设置,链接器标志和可见性(static / private / extern / internal / anonymous namespace)可以增加从最终可执行文件中省略它的可能性。

答案 1 :(得分:0)

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

这是因为默认情况下所有功能都有外部链接。在声明外部链接变量时使用的保留术语“extern”可以(实际上)在声明函数时省略。因此,如果那些未被声明为静态,则可以在别处使用,编译器对此一无所知。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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