gpt4 book ai didi

gcc - GCC LTO 是否执行跨文件死代码消除?

转载 作者:行者123 更新时间:2023-12-04 18:24:22 24 4
gpt4 key购买 nike

假设我有一个函数

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; 放入每个模块,那么是的,代码将被删除。

关于gcc - GCC LTO 是否执行跨文件死代码消除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12715286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com