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

时间:2014-12-11 06:13:23

标签: c++ c c++11 gcc compiler-optimization

有些功能从未被调用过。不是因为它们不是在某些逻辑下被调用,而是因为它们从不从主函数树中调用。假设:

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 ++删除孤儿函数?

1 个答案:

答案 0 :(得分:1)

编译使用优化选项时。传递给编译器的-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;
}