c++ - 现代 C++ 编译器会优化掉错误的 constexpr 条件吗?
问题描述
在我的整个代码中,我都有以下形式的调试条件:
if (Globals::DEBUG_MODE) std::cout << "debugging info" << std::endl;
DEBUG_MODE
是constexpr bool
全局常量头文件中的一个。
我的问题是,当我准备发布我的软件并进行一些最终优化时,我是否可以关闭该 DEBUG_MODE 布尔值,并且编译器将删除所有这些条件,因为它们在编译时评估为 false?或者,如果我想要最优化的发布代码,我是否需要注释掉或完全删除这些行?
我正在使用 Visual Studio 2019 社区并针对 x64 进行编译,但我想更广泛地了解答案,因为我计划在多个平台上进行编译。先感谢您。
解决方案
如果通过丢弃,您的意思是从最终输出二进制文件中删除,是的,大多数编译器都会进行优化(死代码消除),if
甚至更好,if constexpr
. 如果您想确定,请使用您的编译器生成的 asm 进行验证。但是,如果您打算拥有不会在发布模式下编译的代码,那么不会。常规if
不会做,if constexpr
有时只会在模板中做。为此,您可以使用预处理器指令,例如#ifdef DEBUG
.
推荐阅读
- mysql - 如何在 MySQL 中使用 JSON 文档加入子查询?
- azure - 获取 AAD 组的 Azure 角色分配
- python - 我正在尝试用随机整数创建一个数组,然后反转数组
- r - 每组中的条件操作
- xml - 禁用输出转义在 MacOS Catalina 上被 libxslt 库破坏
- python - 半径较小的乌龟中的圆形
- html - 按下按钮时如何切换 p 文本溢出?
- sql - 如何根据 CASE 表达式将列连接成一行?
- mongodb - 如何使用 MongoDB 数据源在 LoopBack 4 中增加计数器变量?
- swift - List 的详细视图中的 SwiftUI @ObservedObject 视图模型从未发布