告诉 gcc/g++ 编译器删除孤立函数
Tell gcc/g++ compiler remove orphaned functions
有些函数永远不会被调用。不是因为它们不是在某种逻辑下调用的,而是因为它们从来没有从主函数的树中调用过。若:
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;
}
相关文章:
- 如何通过 getter 函数删除矢量的元素?
- C++类析构函数删除成员(如果"owner"?
- 使用私有析构函数删除动态分配的对象
- C ++(为什么)确实移动构造函数删除运算符=
- 析构函数删除错误的元素
- C++ 类析构函数删除部分但不是全部成员数据
- 如何使用 deleteEntry 函数 c++ 删除数组中的单个字符串
- 仅仅以避免隐式复制构造函数删除,使用shared_ptr而不是unique_ptr作为类成员明智
- 析构函数删除在 main 中声明的动态数组
- 如果未分配申报表,是否需要删除或处理动态数组?还是它被函数删除
- C++ 函数删除一行
- g++空函数删除是否递归工作
- C++析构函数删除东西(对象,指针?)太快
- C++析构函数删除包含动态数组作为数据成员的对象时的用法
- C++11 析构函数 = 删除
- 父类析构函数删除具有外部启动元素的子类
- 函数删除太多
- C++析构函数删除共享内存
- C++,如何让此函数删除存储在数组中的字符串
- 析构函数删除数组时出错