【问题标题】:Is there a visual c++ predefined preprocessor macro that lets you know when the compiler is optimizing是否有一个 Visual c++ 预定义的预处理器宏可以让您知道编译器何时优化
【发布时间】: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


【解决方案1】:

您可以使用_DEBUGNDEBUG 来检测调试配置。这在技术上与优化标志的含义不同,但在 99% 的情况下这应该足够了。

另一种选择是自己将预处理器定义添加到项目中。

【讨论】:

  • 不幸的是,大多数时候我都必须使用调试信息进行构建,而且我还需要通过优化来构建探查器才能正常工作,否则我会这样做。与 gcc 相比,Visual C++ 似乎很少提供这样的宏。我想知道我是否在某个地方错过了一个充满它们的漂亮网页。
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 2011-01-26
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
相关资源
最近更新 更多