if(0) 和 if(1) 语句是否优化

Are if(0) and if(1) statements optimized?

本文关键字:if 是否 优化 语句      更新时间:2023-10-16

出于调试目的,我希望有一个预处理器定义,例如

#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 ++

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

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

如果优化设置处于打开状态,则所有流行的编译器都会优化if (0)if (1)

但无论如何,这些检查是非常轻量级的,即使它们会变成编译的二进制文件,也不会明显影响性能。


考虑到可读性,我建议从代码中删除if,并使用预处理器去除log()如果日志记录已关闭:

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

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