在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