说我有一个函数

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; 进入每个模块然后是的,代码将被消除。

其他提示

如果代替引用的代码:

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

是否有办法在链接时对其进行优化?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top