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

时间:2017-06-29 14:10:44

标签: c++ compilation compiler-optimization

在C ++中,想象一下我有一个像

这样的函数
bool Aclass::func(){
   return true;
}
以这种方式在主要中调用的

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

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

2 个答案:

答案 0 :(得分:3)

与所有优化问题一样,它取决于编译器和给定的标志。话虽如此,如果提供优化标志,一个体面的现代编译器将能够删除这样的死代码。尝试https://godbolt.org/自己查看哪些编译器和哪些标志将成功删除死代码。

答案 1 :(得分:2)

编译步骤中的编译器会将这些代码行视为有效。例如,如果这些代码行中有错误,那么它将被编译器标记。例如,以下内容将无法编译

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

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

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

这里else语句的else代码将基本上转换为

{
   ...
} 

当代码转换为其编译形式时。

@Yakk brings up a great point。不包含此类代码的编译器称为dead code elimination。但是,仍然可以使用标签来获取正文代码。

另请注意,在编译时评估表达式的情况。然后,您可以使用来自C ++ 17的新构造,称为if constexpr。但是正如我提到的,即使在运行时if中的死代码中,编译器错误仍然存​​在,if constexpr的情况也不同,为了更多地阅读这里的代码示例http://en.cppreference.com/w/cpp/language/if#Constexpr_If和这个答案{{3 }}