我正在尝试从程序中删除未使用的代码-我暂时无法删除该代码,我只是想一开始就将其禁用。
假设我有以下代码:
if (cond){
doSomething()
}
并且cond
总是错误的,所以doSomething
永远不会被调用。
我想做类似的事情:
#define REMOVE_UNUSED_CODE 0
if (cond && REMOVE_UNUSED_CODE){
doSomething()
}
现在,对于我们(希望对编译器而言)这是未使用的代码。
编译器将删除所有这种if
情况,还是将其保留并且永远不会进入?
PS:我不能#if 0
为此目的使用
GCC将显式删除具有控制它们的常量表达式的条件块,而GNU编码标准明确建议您利用此条件,而不要使用诸如依赖预处理程序之类的更粗糙的方法。尽管使用预处理器#if
可能会看起来更有效,因为它可以在较早的阶段删除代码,但实际上,现代优化器在您向其提供尽可能多的信息时效果最佳(当然,如果避免添加阶段,它会使程序更简洁,更一致) -在不需要的地方分离依赖项)。
对于现代编译器而言,这样的决定非常非常容易-即使是非常简单的TCC也会执行一定数量的死代码消除。诸如LLVM和GCC之类的功能强大的系统将发现这一点,并且,作为普通读者,您可能会错过的更复杂的案例(通过跟踪寿命和变量的修改,而不仅仅是查看单个点)。
这是除了全编译等优势,喜欢的事实,内部的代码if
将错误检查(而#if
用于移除代码更有用的是当前系统上的错误,比如不存在的平台函数的引用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句