有些功能从未被调用过。不是因为它们不是在某些逻辑下被调用,而是因为它们从不从主函数树中调用。假设:
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 ++删除孤儿函数?
答案 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;
}