【问题标题】:Does gcc/g++ generate the body of an if(false) statement?gcc/g++ 是否生成 if(false) 语句的主体?
【发布时间】:2017-06-29 14:10:44
【问题描述】:

在 C++ 中,假设我有一个类似的函数

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

主要是这样调用的

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

编译器会生成这些代码行吗?

【问题讨论】:

  • 另见constexpr if
  • 这完全取决于编译器,但据我所知,我的猜测是编译器不会从中生成任何代码(当然,它仍然会进行语法检查)。跨度>

标签: c++ compilation compiler-optimization


【解决方案1】:

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

【讨论】:

    【解决方案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。然而,正如我提到的,即使在运行时 ifs 的死代码中,编译器错误仍然存​​在,if constexprs 的情况有所不同,更多请阅读此处的代码示例http://en.cppreference.com/w/cpp/language/if#Constexpr_If 和此答案https://stackoverflow.com/a/38317834/5501675

    【讨论】:

    • 命名这种技术会改善答案:我相信它被称为“死代码消除”。该代码是“死的”,因为它无法访问。 (请注意,如果body 中有goto'd 的标签,则可以访问if (false) { body }
    • @Yakk 总是从你的答案和 cmets 中学到东西!谢谢
    • goto 是一个非常棒的地方。假设没有 goto 语句并且编译器标志(例如 -O2)用于优化和消除这些行,那么重构代码是否仍然值得?
    猜你喜欢
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2019-05-11
    • 2020-08-09
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多