编译器会删除总是评估为零的If块吗?

时间:2012-02-17 22:24:42

标签: c++ optimization compiler-construction

编译器会删除这个if语句吗?

 #define DEBUG 0
 int main(int argc, char ** argv)
 {
    if(DEBUG)
    {
       ...
    }
    return 0;
 }

我试图谷歌这个,并搜索stackoverflow但我认为我的搜索条件不好,因为我找不到信息。

如果这是优化的,我想了解的有关优化的内容是什么?

5 个答案:

答案 0 :(得分:4)

是的,任何体面的C / C ++编译器都会删除这样的if块。

答案 1 :(得分:3)

你不需要猜测。编译并使用调试器观察汇编指令。您甚至不需要熟悉程序集就可以查看是否为相关行生成了实际代码。

答案 2 :(得分:3)

我不确定编译器是否可以优化它。我想是的,因为在这种情况下你不会有任何副作用,所以可以安全地删除它而不改变代码的语义。

无论如何,猜测并不好,依赖优化也不是很好。

为什么不使用#ifdef .. #endif块代替代码块?

#define DEBUG

#ifdef DEBUG
  ...
#endif

通过这种方式,您将获得肯定的结果。

答案 3 :(得分:2)

你无法做出通用声明,即每个编译器都会以相同的方式优化相同的事情。同样,今天可能碰巧执行此操作的任何编译器可能不会在将来的某个版本中使用。

是的,今天的许多编译器可以并且将会这样做,但这并不意味着你应该计划或期望它。如果您不想在那里使用该代码,请将其注释掉,如果将其删除或删除它。

正如其他人所说,试一试,亲自体会。如果您正在调试某些内容并怀疑这是否已经发生过,请查看并找出...

答案 4 :(得分:1)

你有很好的答案在编译器程序集输出中检查它。我想分享一些对我来说非常有用的类似成语:

 int main(int argc, char ** argv)
 {
    const bool bDebug = false;
    if(bDebug)
    {
       ...
       LOG(""); /// some heavy loging here
    }
    return 0;
 }

所以我在我的代码中的某些相关位置留下了这样的if-s,当我得到错误报告时发生了一些不好的事情我逐步完成代码,当我需要输出一些大型数组/数据结构时,我从调试器修改bDebug变量(实际上我将它们命名为bVerbose),然后允许代码输入这样的IF-s。您不必重新编译代码以添加大量日志记录。