说我有一个功能
void do_something() {
//....
#ifdef FEATURE_X
feature_x();
#endif
//....
}
Run Code Online (Sandbox Code Playgroud)
我可以编译并运行它没有任何问题; 如果我想要我可以通过的功能-D FEATURE_X
,它的工作原理.
但是,如果我想do_something
放入另一个文件(并且每次我决定更改选项时也不必重新编译该文件)该怎么办?如果它在同一个文件中,我会认为
const int FEATURE_X=0;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
Run Code Online (Sandbox Code Playgroud)
将正确使用死代码消除,取消呼叫.如果我把它放在另一个文件中,没有LTO,
extern const int FEATURE_X;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
Run Code Online (Sandbox Code Playgroud)
它不会删除代码(它无法知道).因此,在启用链接时优化的情况下,编译器是否可以检测FEATURE_X
链接时的值,确定是否使用了代码,并在适当的情况下将其删除?
小智 7
GCC会交叉模块无法访问的函数删除,但它无法确定代码在最后一个测试用例中是否已死,因为FEATURE_X的常量值将被确定得太晚.
如果您将使用-D方式或将您const int FEATURE_X=0;
放入每个模块然后是,则代码将被删除.
归档时间: |
|
查看次数: |
429 次 |
最近记录: |