在C ++中,想象一下我有一个像
这样的函数bool Aclass::func(){
return true;
}
以这种方式在主要中调用的
if(!func()) {
//do stuff
}
编译器是否生成这些代码行?
答案 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 }}