现代 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
.
在我的所有代码中,我都有以下形式的调试条件:
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
.