if(0) 和 if(1) 语句是否优化
Are if(0) and if(1) statements optimized?
出于调试目的,我希望有一个预处理器定义,例如
#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
相关文章:
- 无论条件是否为true,if总是在c++中执行
- 是否可以使用if constexpr删除控制流语句
- 如果中的多个语句是否与多个 if 相同?
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 尝试使用 indexOf 创建一个 if 语句来检查字符串是否包含字符.有一点麻烦
- 我的 if 语句打印在我的 while 循环中的每个 if 语句上,无论它是否为假
- 是否可以在 "if" 语句中声明变量?
- 是否可以在C++中使用三元运算符在 if 语句中选择比较运算符?
- 在if条件下,右或左改变值的相等性检查是否有任何区别
- 是否可以使用"if constexpr"来声明具有不同类型和init-expr的变量
- 是否应该定义 #if 中使用的宏?
- "If Else"语句缩进在C++中是否重要?
- gcc/g 是否会生成if(false)语句的主体
- 是否可以缩短此 if 语句
- 是否可以使用模板非类型参数使用#if指令?(矢量多合一类)
- 如何避免使用多个if-else来检查返回值是否为错误代码?
- 布尔表达式是否像使用 if 或 switch 进行分支一样繁琐?
- 是否可以使用指向语句中声明的变量地址的指针"if"
- if 语句贯穿始终,无论是否满足条件
- 使用 "else if" 是否消除了在 while 循环中的每个条件后休息的需要?