我有以下代码:
#include <stdio.h>
typedef struct {
bool some_var;
} model_t;
const model_t model = {
true
};
void bla(const model_t *m) {
if (m->some_var) {
printf("Some var is true!\n");
}
else {
printf("Some var is false!\n");
}
}
int main() {
bla(&model);
}
我想编译器拥有消除所需的所有信息else
中的条款bla()
功能。调用该函数的唯一代码路径来自 main,并且它接收const model_t
,所以它应该能够确定该代码路径没有被使用。然而:
在 GCC 12.2 中,我们看到第二部分被链接进来。
If I inline
不过这个功能消失了:
我在这里缺少什么?有什么方法可以让编译器做一些更智能的工作吗?这在 C 和 C++ 中都会发生-O3
and -Os
.
编译器does消除内联函数中的 else 路径main
。您混淆了无论如何都不会调用的全局函数,并且最终将被链接器丢弃。
如果您使用-f整个程序 https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fwhole-program标志让编译器知道不会链接其他文件,未使用的段将被丢弃:
[在线查看] https://godbolt.org/z/dovas8ePe
此外,您使用static
or inline
关键字来实现类似的效果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)