告诉 gcc/g++ 编译器删除孤立函数

Tell gcc/g++ compiler remove orphaned functions

本文关键字:函数 删除 编译器 gcc g++ 告诉      更新时间:2023-10-16

有些函数永远不会被调用。不是因为它们不是在某种逻辑下调用的,而是因为它们从来没有从主函数的树中调用过。若:

int A()
{
   if(...)
      call F();
}
int B()
{
}
int C()
{
    call B();
}
int D()
{
    call A();
}
int F()
{
    call A();
}
int main()
{
    call D();
    call F();
}

所以在这个例子中:

main  ---> D
       |
       --> F
D  ------> A
F -------> A
A -------> F
C -------> B

因此,运行此应用程序 B 和 C 绝没有机会被调用。他们是孤儿。但似乎 gcc/g++ 并没有像我检查的那样删除孤立函数:

计划1:

int main()
{
    int a=4;
    int b=3;
    int c=a+b;
    b=c-a;
    a=c-b;
    return 0;
}

在命令行中运行:

g++ -std=c++11 test.cpp
md5sum a.out

我得到:

546da269abddb8dcb3883527a362f769  a.out

现在通过添加一个 orpan 函数(测试),我得到了不同的执行文件:

计划2:

int test()
{
}
int main()
{
    int a=4;
    int b=3;
    int c=a+b;
    b=c-a;
    a=c-b;
    return 0;
}

在命令行中运行:

g++ -std=c++11 test.cpp
md5sum a.out

给出不同的哈希值:

64095263965d2d94ed2f305f99a2b25a  a.out

它表明这个永远不会在我的程序中调用的孤立函数影响了编译的代码。有没有办法告诉 gcc/g++ 删除孤立函数?

编译时使用优化选项。传递给编译器的 -O 标志

改变

g++ -std=c++11 test.cpp

g++ -O1 -std=c++11 test.cpp

使用此选项,两个程序的md5sum将相同。

计划1:

int main()
{
    int a=4;
    int b=3;
    int c=a+b;
    b=c-a;
    a=c-b;
    return 0;
}

计划2:

int test()
{
}
int main()
{
    int a=4;
    int b=3;
    int c=a+b;
    b=c-a;
    a=c-b;
    return 0;
}