【发布时间】:2020-08-26 12:58:14
【问题描述】:
在我的所有代码中,我都有以下形式的调试条件:
if (Globals::DEBUG_MODE) std::cout << "debugging info" << std::endl;
DEBUG_MODE 是全局常量头文件中的constexpr bool。
我的问题是,当我准备发布我的软件并进行一些最终优化时,我是否可以关闭该 DEBUG_MODE 布尔值,并且编译器将删除所有这些条件,因为它们在编译时评估为 false?或者,如果我想要最优化的发布代码,是否需要注释掉或完全删除这些行?
我正在使用 Visual Studio 2019 社区并针对 x64 进行编译,但我想更广泛地了解答案,因为我计划在多个平台上进行编译。提前谢谢你。
【问题讨论】:
-
一个好的编译器应该。为什么不使用编译器编译代码并检查程序集以查看分支是否存在?
-
为什么不使用
if constexpr并消除所有疑虑? -
请注意,
if constexpr仅在条件依赖于模板时丢弃未采用分支的代码。 -
好老
#ifdef DEBUG... -
这个问题实际上是关于实施质量的。不能保证编译器可以检测为假的条件被“优化掉”(例如,在目标文件或可执行文件中没有发出代码的意义上)。大多数现代编译器,在更高的优化设置下,可能会优化掉这些东西。
if constexpr也是如此——C++ 标准只要求代码诊断和执行继续就好像丢弃了一个错误的分支。这是否会转化为“优化掉”的错误分支,这又是一个实施质量问题。
标签: c++ debugging compiler-optimization constexpr