Подтвердить что ты не робот

Какой лучший уровень оптимизации g++ при создании отладочной цели?

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

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

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

4b9b3361

Ответ 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++ при построении производственной программы", что гораздо более длительное обсуждение