说我有一个函数
void do_something() {
//....
#ifdef FEATURE_X
feature_x();
#endif
//....
}
我可以毫无问题地编译和运行它;如果我想要这个功能我可以通过-D FEATURE_X
它有效。
但是,如果我想把do_something
到另一个文件中(并且每次我决定更改选项时都不必重新编译该文件)。如果它在同一个文件中,我认为
const int FEATURE_X=0;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
将正确使用死代码消除,消除调用。如果我把它放在另一个文件中,没有 LTO,
extern const int FEATURE_X;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
它不会删除代码(它无法知道)。因此,在启用链接时间优化的情况下,编译器可以检测到FEATURE_X
在链接时,确定代码是否被使用,如果合适则将其删除?
GCC确实删除了跨模块不可达函数,但它无法确定您最后一个测试用例中的代码是否已死,因为FEATURE_X的常量值确定得太晚了。
如果您将使用 -D 方式或将您的const int FEATURE_X=0;
进入每个模块然后是的,代码将被消除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)