Компилирует ли с -g само по себе ухудшение производительности?

(Это вопрос о gcc и clang, но может применяться к другим компиляторам.)

Если я скомпилирую свой код на C или С++ и генерирую информацию об отладке с помощью переключателя -g, это само по себе ухудшает производительность скомпилированной программы каким-либо образом... (1.) С минимальной оптимизацией (-O0)? (2.) С максимальной оптимизацией (-O3)?

Примечание. Я не имею в виду ограничение производительности при анализе/загрузке исполняемого файла, что больше из-за дополнительного контента; Я имею в виду код, который выполняется.

Ответ 1

Я не думаю, что есть разница в производительности. Действительно, сгенерированный код будет таким же и -g можно использовать с -O в соответствии с документацией здесь. Кроме того, отладочные символы не записываются в код, а в другой раздел под названием "раздел отладки", который даже не загружается во время выполнения (только отладчиком).

-g не изменит, какие оптимизации выполняются или генерируется код. Это gcc-политика, как указано здесь

Однако может быть полезно отметить, что в той же документации указано, что:

Ярлыки, сделанные оптимизированным кодом, могут иногда удивлять: некоторые объявленные вами переменные могут вообще отсутствовать; поток контроля может коротко двигайтесь туда, где вы этого не ожидали; некоторые утверждения не могут быть выполняются, потому что они вычисляют постоянные результаты или их значения уже под рукой; некоторые заявления могут выполняться в разных местах потому что они были перемещены из петель. Тем не менее возможно для отладки оптимизированного вывода. Это делает разумным использование оптимизатор для программ, которые могут иметь ошибки.

Итак, в конце концов, отладка никогда не повредит вашей оптимизации, но противоположная ложь, и использование -O3 может привести к ухудшению вашей отладочной информации (например, путем удаления ненужных переменных).

Обратите внимание, что в этом случае может быть лучше использовать -Og (как указано здесь), так как это будет:

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

Однако это повлияло бы на производительность, поскольку некоторые оптимизации, которые мешали бы отладке, не выполнялись.


Edit:

Ссылки и цитаты отвечают на ваш вопрос для gcc. Это может не относиться к другим компиляторам, таким как clang. Однако я нашел некоторую документацию и для clang. Например здесь:

В принципе, информация об отладке позволяет вам скомпилировать программу с "-O0 -g" и получить полную отладочную информацию, позволяющую произвольно изменить программу, как она выполняется из отладчика. Компиляция программы с "-O3 -g" дает вам полную отладочную информацию, которая всегда доступный и точный для чтения (например, вы получаете точный стек следы, несмотря на устранение хвоста и наложение), но вы можете потерять возможность изменения программы и функций вызова, где оптимизированы из программы или полностью отшлифованы.

Ответ 2

Флаг -g добавляет информацию об отладке в двоичный файл. Это существует в отдельном разделе (.stab и .stabstr) исполняемого файла из бит выполнения .text CPU. При запуске вне отладчика раздел отладки не загружается загрузчиком операционной системы. Информация об отладке также может быть легко удалена с помощью утилиты strip для создания двоичных файлов, которые идентичны скомпилированным без флага -g.

Обычно, если вы хотите отлаживать материал, вы будете скомпилированы без оптимизации и макроса препроцессора NDEBUG. Однако эти вещи не контролируются флагом -g.

Ответ 3

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