现代 C++ 编译器会优化掉错误的 constexpr 条件吗?

Will a modern C++ compiler optimize away false constexpr conditionals?

在我的所有代码中,我都有以下形式的调试条件:

if (Globals::DEBUG_MODE) std::cout << "debugging info" << std::endl;

DEBUG_MODE 是全局常量头文件中的 constexpr bool

我的问题是,当我准备发布我的软件并进行一些最终优化时,我是否可以关闭 DEBUG_MODE bool 并且编译器将删除所有这些条件,因为它们在期间评估为 false编译时间?或者,如果我想要最优化的发布代码,我是否需要注释掉或完全删除这些行?

我正在使用 Visual Studio 2019 社区并针对 x64 进行编译,但我想更笼统地了解答案,因为我计划在多个平台上进行编译。提前谢谢你。

如果丢弃,您的意思是从最终输出二进制文件中删除,是的,大多数编译器会针对 if 进行优化 (Dead code elimination),更好的是 if constexpr。如果您想确定,请使用您的 compiler-generated asm 进行验证。但是,如果您计划拥有不会在发布模式下编译的代码,那么就不要了。常规 if 不会做,if constexpr 只会有时在模板中做。为此,您可以使用 pre-processor 指令,例如 #ifdef DEBUG.