【发布时间】:2016-09-20 10:58:21
【问题描述】:
我希望能够使用 Visual c++ 编译器 (vc12) 来做这样的事情:
// If we have compiled with O2
#ifdef _O2_FLAG_
bool debug_mode = false;
// If we are in dirty slow non optimized land
#else
bool debug_mode = true;
#endif
但我找不到用于此目的的预定义宏。
上下文:
debug_mode 标志的用法如下:
if (!debug_mode && search_timer->seconds_elapsed() > 20) {
return best_result_so_far;
}
问题在于,在调试实例中,我不断地单步执行此操作失败并把我炸飞,因为奇怪的是,我单步执行代码所花费的时间比 CPU 通常执行的时间要长得多 :-)
如果在调试时有一些底层时钟暂停,那也可以解决我的问题。目前我正在使用对 std::chrono::high_res_clock::now() 的两次调用之间的差异。
编辑:
为了回应几个 cmet 解释为什么我不想做我想做的事,我或许应该将问题改写为简单:cl 中是否有与 gcc 的 __optimize__ 等效的内容?
【问题讨论】:
-
即使它确实存在,预处理器也不能告诉你编译器将优化一个翻译单元(比如如果不能进行优化),只是它可能
-
你做错了。您需要提高调试技能(例如,使用跟踪点而不是断点等)。
-
使用编译器开关检查调试模式。几乎每个 IDE 都可以使用不同的编译器选项设置调试和发布模式。
-
值得注意的是,检测代码中的优化很可能会阻止优化,因为 C++ 优化规则要求在任何给定情况下允许优化,它必须在代码中可验证 -水平,它产生与未优化版本相同的结果。如果您有以优化为条件的代码,这可能会阻止验证优化是否产生相同的结果。
-
如果
!debugmode &&是true,优化编译器无论如何都会删除它,或者如果这个表达式是false,它将删除整个if 语句。你不能用这样的标志可靠地降落在安全的地方(如果可能的话)。更好的方法是使用Debug作为条件编译。
标签: c++ visual-c++ compiler-optimization predefined-macro