Каков наилучший уровень оптимизации g ++ при создании цели отладки? - PullRequest
32 голосов
/ 21 сентября 2011

Если вы хотите создать что-то отлаживаемое (в частности, g ++, но, возможно, поделится ответом с gcc), какой уровень -O лучше? Другими словами, при создании цели «отладки», а не цели «выпуска».

Онлайн-документы gcc немного отрывочны при сравнении -O0 и -O1 ( здесь ). Моя интерпретация заключается в том, что -O1 включает только одну оптимизацию, которая даже может повлиять на отладку, а именно -fomit-frame-pointer. Но, процитировав документ, он включен только в -O1, «если это не мешает отладке». Я правильно истолковываю это?

В другом посте на этом сайте ( здесь ) конкретно говорится о -O2, и ответ в основном "это работает, но вы выполняете не по порядку". Который, IMO, может варьироваться от раздражающего до разрушительного в зависимости от того, как плохо все прыгает.

Ответы [ 3 ]

49 голосов
/ 24 апреля 2013

GCC 4.8 вводит новый уровень оптимизации: -Og для лучшего из обоих миров.

-OG
Оптимизировать опыт отладки. -Og включает оптимизации, которые не мешают отладки. Это должен быть уровень оптимизации выбора для стандарта цикл edit-compile-debug , предлагающий разумный уровень оптимизации при сохранении быстрая компиляция и хороший опыт отладки.

Таким образом, выполняется некоторая оптимизация, благодаря которой вы получаете лучшую производительность, лучшее обнаружение неинициализированных переменных, а также можете проходить через программу в GDB, не перепрыгивая вперед и назад через функцию.

26 голосов
/ 22 сентября 2011

Итак ... какие флаги подходят для отладочной сборки?

Независимо от того, что вам удобно, отладка.

При сборке с -g -O0 отладкапроще всего, но код выполняется очень медленно.

Когда вы строите с -g -O1, вы начнете наблюдать оптимизацию иногда .Вы попытаетесь войти в функцию и обнаружите, что она встроена и т. Д.

С -g -O2 вы заметите оптимизацию много .Вы получите optimized out при печати переменных [1], вы неожиданно будете прыгать в коде и т. Д.

С -g -O3 вы увидите те же симптомы, но чаще.

GCC на самом деле не имеет уровней, превышающих -O3, так что это конец строки.

Люди, которые понимают преобразования, которые GCC выполнил с помощью -O3, будут иметь небольшие проблемы при отладке этого кода (Вы всегда можете посмотреть на сборку, выяснить, где находится переменная, которую вы хотите на самом деле , и идти оттуда).Но для простых смертных обычно довольно сложно отладить код -O2.

[1] В настоящее время в GDB и GCC ведется работа по сокращению количества optimized out экземпляров, но она еще не завершена.

0 голосов
/ 21 сентября 2011
Режим отладки

(-g) и уровни оптимизации (семейство -O*) являются независимыми вопросами. флаг -g в основном инструктирует gcc включать символы отладки при компиляции (и некоторые подсказки, соответствующие номерам строк в коде). Может применяться к любому уровню оптимизации.

Следовательно, простой ответ - «лучший уровень оптимизации g ++ при построении производственной программы», что является гораздо более длительным обсуждением

...