Какой лучший уровень оптимизации g++ при создании отладочной цели?
Если вы хотите создать что-то отлаживаемое (g++ конкретно, но, возможно, разделяет ответ с gcc), какой лучший уровень -O? Другими словами, при создании цели "отладки", а не цели "выпуска".
Онлайн-документы gcc являются немного отрывочными при сравнении -O0 и -O1 (здесь). Моя интерпретация заключается в том, что -O1 позволяет только одну оптимизацию, которая даже может повлиять на отладку, которая является -fomit-frame-pointer. Но, цитируя документ, он включается только в -O1, "где это не мешает отладке". Правильно ли я это интерпретирую?
Другое сообщение на этом сайте (здесь) говорит о -O2 конкретно, и ответ в основном "он работает, но вы получаете исполнение вне порядка". Который, ИМО, может варьироваться от раздражающего до разрушительного в зависимости от того, как сильно скатываются вещи.
Ответы
Ответ 1
Итак... какие флаги подходят для сборки отладки?
Независимо от того, что вам удобно отлаживать.
Когда вы создаете с помощью -g -O0
, отладка проще всего, но код работает очень медленно.
Когда вы создаете с помощью -g -O1
, вы иногда будете наблюдать за оптимизацией. Вы попытаетесь войти в функцию и обнаружите, что она вставлена, и т.д.
С -g -O2
вы заметите оптимизацию. Вы получите optimized out
при печати переменных [1], вы получите неожиданный прыжок в коде и т.д.
С -g -O3
вы увидите те же симптомы, но чаще.
GCC на самом деле не имеет уровней выше -O3
, так что конец строки.
Люди, которые понимают преобразования, которые GCC выполнил с помощью -O3
, будут иметь небольшую проблему, отлаживая этот код (вы всегда можете заглянуть в сборку, выяснить, где находится фактическая переменная, и перейти оттуда). Но для простых смертных обычно довольно сложно отлаживать код -O2
.
[1] В GDB и GCC текущая работа уменьшает количество экземпляров optimized out
, но она еще не закончена.
Ответ 2
GCC 4.8 вводит новый уровень оптимизации: -Og
для лучшего из обоих миров.
-OG
Оптимизируйте опыт отладки. -Og обеспечивает оптимизацию, которая не мешает отладки. Это должен быть оптимальный уровень выбора для стандартного edit-compile-debug cycle, предлагая разумный уровень оптимизации при сохранении быстрая компиляция и хороший отладочный опыт.
Таким образом, выполняется некоторая оптимизация, поэтому вы получаете лучшую производительность, лучшее, возможно, неинициализированное обнаружение переменных, и вы также можете проходить через программу в GDB, не перепрыгивая назад и вперед через эту функцию.
Ответ 3
режим отладки (-g
) и уровни оптимизации (семейство -O*
) являются независимыми проблемами. флаг -g
в основном инструктирует gcc включать отладочные символы при компиляции (и некоторые подсказки, соответствующие номерам строк в коде). Он может применяться к любому уровню оптимизации.
Простой ответ, таким образом, является "лучшим уровнем оптимизации g++ при построении производственной программы", что гораздо более длительное обсуждение