G++ - использует флаг "-g" для сборки, создает хорошую идею?

Просто, чтобы дать некоторый контекст, я говорю о компиляции кода на С++ с g++ здесь.

Я вижу, как включение флага -g для производственных сборок было бы удобно для обслуживания: программа будет намного легче отлаживать, если она неожиданно завершится.

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

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

Ответ 1

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

Ответ 2

Я помню, как читал, что некоторые оптимизации отключены с помощью отладочных символов: Как вариант отладки -g Изменить исполняемый файл двоичного файла?

Googling также показывает больше сообщений, относящихся к этой теме.

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

Ответ 3

Мой вопрос здесь, не включает ли флаг -g на выходной исполняемый файл каким-либо другим способом, чем увеличение его размера?

Нет, вполне возможно создать оптимизированные двоичные файлы с информацией об отладке, которая никак не влияет на нормальный код (хотя эта информация может быть менее полезной, поскольку переменные не должны существовать время от времени, встроенные функции сложнее debug и т.д.)

Распространение Debian создает пакеты с информацией об отладке, которая позже удаляется (иногда разделяется на "пакет отладки" ).

Обратите внимание, однако, что увеличение размера может быть довольно большим.