Есть ли предопределенный макрос препроцессора визуального С++, который позволяет узнать, когда компилятор оптимизирует

Я хотел бы иметь возможность сделать что-то подобное с помощью визуального компилятора С++ (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;
}

Проблема в том, что в экземпляре отладки, который я прохожу, это постоянно терпит неудачу и бомбит меня, потому что, как ни странно, мне требуется намного больше времени, чтобы выполнить код, чем процессор обычно выполняет его :-)

Если есть какие-то базовые часы, которые останавливаются при отладке, это также решит мою проблему. В настоящее время я использую разницу между двумя вызовами std::chrono::high_res_clock::now().

РЕДАКТИРОВАТЬ:

В ответ на несколько комментариев, объясняющих, почему я не хочу делать то, что хочу, я, возможно, должен переформулировать вопрос так: есть ли эквивалент gcc __optimize__ в cl?


person sji    schedule 23.05.2016    source источник
comment
Даже если он существует, препроцессор не может сказать вам, что компилятор будет оптимизировать единицу перевода (скажем, если никакая оптимизация не может быть выполнена), а только то, что он может   -  person StoryTeller - Unslander Monica    schedule 23.05.2016
comment
Вы идете об этом неправильно. Вам нужно улучшить свои навыки отладки (например, использовать точки трассировки вместо точек останова и т. д.).   -  person IInspectable    schedule 23.05.2016
comment
Используйте переключатель компилятора для проверки режима отладки. Практически каждая IDE имеет возможность установить режим отладки и выпуска с различными параметрами компилятора.   -  person Lundin    schedule 23.05.2016
comment
Стоит отметить, что обнаружение оптимизации в вашем коде, скорее всего, может помешать оптимизации, поскольку правила оптимизации C++ требуют, чтобы оптимизация была разрешена в любом конкретном случае, она должна быть проверена на уровне кода, что она дает тот же результат, что и неоптимизированная версия. Если у вас есть код, зависящий от оптимизации, это может помешать проверке того, что оптимизация дает тот же результат.   -  person Matt Jordan    schedule 23.05.2016
comment
Оптимизирующий компилятор в любом случае удалит !debugmode &&, если это true, или удалит весь оператор if, если это выражение false. Вы не сможете надежно приземлиться в безопасном месте с таким флагом (если бы это было возможно). Лучше просто использовать Debug как условную компиляцию.   -  person Ajay    schedule 25.05.2016
comment
@Ajay /Zi всегда включен, потому что он нужен профилировщику, поэтому, к сожалению, Debug для меня бесполезен. Я знаю, что если бы существовало соответствующее определение препроцессора, я мог бы просто окружить оператор if ifdefs для того же эффекта. Что я хочу сделать, так это переключаться между режимами отладки и профилирования с минимальными усилиями (т.е. наличие /O2 в строке компиляции), что было бы просто с использованием __optimize__ gcc, отсюда вопрос, было ли что-то подобное в cl.   -  person sji    schedule 25.05.2016


Ответы (1)


Вы можете использовать _DEBUG или NDEBUG для определения конфигурации отладки. Технически это не означает то же самое, что флаг оптимизации, но в 99% случаев этого должно быть достаточно.

Другой вариант — добавить определение препроцессора в проект самостоятельно.

person Rick de Water    schedule 23.05.2016
comment
К сожалению, мне приходится строить с отладочной информацией в большинстве случаев, когда я строю с оптимизацией, чтобы профилировщик работал правильно, иначе я бы сделал это. Похоже, Visual C++ дает очень мало таких макросов по сравнению с gcc. Я подумал, не пропустил ли я где-нибудь красивую веб-страницу, полную их. - person sji; 23.05.2016