gcc/g 是否会生成if(false)语句的主体



在C 中,想象一下我的功能

bool Aclass::func(){
   return true;
}

以这种方式在主机中称为

 if(!func()) { 
    //do stuff 
 }

编译器是否生成这些代码行?

像所有优化问题一样,它取决于编译器和给定的标志。话虽如此,如果提供了优化标志,则可以删除像这样的现代编译器。尝试https://godbolt.org/亲自查看哪个编译器和哪个标志将成功删除死亡代码。

编译步骤的编译器将把这些代码视为有效。例如,如果您在这些代码行中有错误,则编译器将标记它。因此,例如,以下内容不会编译

if (false) {
    auto s = std::string{1.0};
}

,但是大多数优化器不会在该源文件的编译表格中添加该代码。但是,如果需要,仍然会添加相关的代码,例如

if (true) { ... } 
else { ... }

在这里,其他语句的其他代码本质上将转换为

{
   ...
} 

当代码转换为编译表格时。


@yakk提出了一个很好的观点。不包括此类代码的编译器称为"消除代码"。但是,标签仍然可以用于达到车身代码。


还要注意,在这些情况下,在编译时评估表达式。然后,您可以使用if constexpr的C 17中的新结构。但是,正如我提到的编译器错误,即使在运行时 if中的死亡代码中仍然存在,if constexpr s的情况有所不同,有关更多读取代码示例此处http://en.cppreference.com/w/cpp/language/language/if#conconstexppr_if_if此答案https://stackoverflow.com/a/38317834/5501675

最新更新