编译器会删除始终评估为零的 If 块吗? [重复]

问题描述 投票:0回答:5

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

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

我尝试用谷歌搜索这个,并搜索 stackoverflow,但我认为我的搜索词不好,因为我找不到信息。

如果这是优化的,我想阅读什么来了解优化?

c++ optimization
5个回答
4
投票

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


3
投票

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

无论如何猜测都不好,依赖优化也不好。

为什么不使用

#ifdef .. #endif
块而不是代码块?

#define DEBUG

#ifdef DEBUG
  ...
#endif

这样你就会有一个确定的结果。


3
投票

你不需要猜测。使用调试器观察汇编指令进行编译和单步执行。您甚至不需要非常熟悉汇编来查看是否为有问题的行生成了实际代码。


2
投票

你不能做出通用的声明,即每个编译器都会以相同的方式优化相同的东西。 同样,今天可能发生的任何编译器可能不会在未来的版本中执行此操作。

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

正如其他人提到的,尝试一下并亲自找出答案。 如果您正在调试某些内容并怀疑这已经发生或尚未发生,只需查看并找出...


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。您不必重新编译代码来添加大量日志记录。

© www.soinside.com 2019 - 2024. All rights reserved.