【问题标题】:Will a modern C++ compiler optimize away false constexpr conditionals?现代 C++ 编译器会优化掉错误的 constexpr 条件吗?
【发布时间】: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


【解决方案1】:

如果通过丢弃,您的意思是从最终输出二进制文件中删除,是的,大多数编译器都会为 if 和更好的 if constexpr 进行优化 (Dead code elimination)。如果您想确定,请使用编译器生成的 asm 进行验证。但是,如果您打算拥有不会在发布模式下编译的代码,那么不会。常规的if 不会做,if constexpr 有时只会在模板中做。为此,您可以使用预处理器指令,如 #ifdef DEBUG

【讨论】:

  • 这里的优化名称是Dead Code Elimination,这可能对 OP 有用(我发现为某事命名可以更容易理解/了解它)
  • 感谢 Ayxan 和 Adam。我没有听说过这个词(死代码消除)。它确实有助于为其命名,并带来大量我以前没有的在线搜索和信息。非常感谢大家的帮助。
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多