2

说我有一个功能

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链接时的值,确定代码是否被使用,并在适当时将其删除?

4

2 回答 2

7

GCC 确实删除了跨模块无法访问的功能,但它无法确定您最后一个测试用例中的代码已死,因为 FEATURE_X 的常量值确定得太晚了。

如果您将使用 -D 方式或将您const int FEATURE_X=0;放入每个模块中,那么是的,代码将被消除。

于 2012-11-07T17:54:16.483 回答
0

如果不是引用的代码:

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

如果它是用这样的链接时间变量完成的:

extern const int FEATURE_X;

void do_something() {
    //....
    if(NULL != &FEATURE_X) {
        feature_x();
    }
    //....
}

然后在链接器指令文件中,定义

define exported symbol FEATURE_X = 0x0

无论如何在链接时优化它吗?

于 2016-08-25T17:37:59.143 回答