【问题标题】:Are if(0) and if(1) statements optimized?if(0) 和 if(1) 语句是否优化?
【发布时间】:2015-02-12 23:41:56
【问题描述】:

出于调试目的,我想要一个预处理器定义,例如

#define LOGGING 1 //or #define LOGGING 0 when logging is undesired

并添加

if (LOGGING) log("Text here!");

我希望它发生在代码中的任何地方。

现在,我只想在编译器能够读取的情况下这样做

if (0) log("blah blah blah");

例如,并且根本不将其添加到最终代码中。或者,如果 if 设置为 true

if (1) log("blah blah blah");

删除 if 条件,只添加该行。

那么,最后,那些 if 真的会影响性能吗?

PS:我用的是VS,不过也可以用g++

【问题讨论】:

  • 这取决于编译器,但很可能是的,无法到达的分支会被优化掉。

标签: c++ visual-c++ logging compilation c-preprocessor


【解决方案1】:

任何体面的编译器都应该优化掉带有硬编码值的if 语句。但是,如果您已经开始使用这条线,为什么不使用预处理器来完成这一切呢?

#ifdef LOGGING
#define LOG(message)     printf(message);
#else
#define LOG(message)
#endif

【讨论】:

    【解决方案2】:

    if (0)if (1) 会被所有流行的 编译器优化掉,如果优化设置打开的话。

    但无论如何,这些检查都是非常轻量级的,即使将其编译为二进制文件,也不会显着影响性能。


    考虑到可读性,我建议从代码中删除ifs,并在日志记录功能关闭时使用预处理器去除log()

    #if !defined(LOGGING)
      #define log(message)
    #endif
    

    【讨论】:

      【解决方案3】:

      在发布模式下使用 VS 进行了优化。

      您可以在汇编代码中检查自己(继续项目属性、C++、输出文件并选择带有源代码的汇编器。

      在调试模式下,生成的代码没有经过优化,看起来像:

      ; 14   :    if (0) 
          xor eax, eax    
          je  SHORT $LN2@test            <<<<<<<<< conditional test 
      ; 15   :        log("blah blah blah");
          push    OFFSET ??_C@_0P@KFNJKNNG@blah?5blah?5blah?$AA@
          call    ?log@@YAXPAD@Z              ; call log
          add esp, 4
      $LN2@test:
          ...                             << followed by the standard return sequence 
          ret 0 
      

      在发布模式下是:

      ; 14   :    if (0) 
      ; 15   :        log("blah blah blah");
      ; 16   : }
          ret 0                           << nothing:  he returns
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 2010-09-07
        • 2013-09-17
        • 2017-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多