Ответ 1
Я не думаю, что есть разница в производительности. Действительно, сгенерированный код будет таким же и -g
можно использовать с -O
в соответствии с документацией здесь. Кроме того, отладочные символы не записываются в код, а в другой раздел под названием "раздел отладки", который даже не загружается во время выполнения (только отладчиком).
-g
не изменит, какие оптимизации выполняются или генерируется код.
Это gcc-политика, как указано здесь
Однако может быть полезно отметить, что в той же документации указано, что:
Ярлыки, сделанные оптимизированным кодом, могут иногда удивлять: некоторые объявленные вами переменные могут вообще отсутствовать; поток контроля может коротко двигайтесь туда, где вы этого не ожидали; некоторые утверждения не могут быть выполняются, потому что они вычисляют постоянные результаты или их значения уже под рукой; некоторые заявления могут выполняться в разных местах потому что они были перемещены из петель. Тем не менее возможно для отладки оптимизированного вывода. Это делает разумным использование оптимизатор для программ, которые могут иметь ошибки.
Итак, в конце концов, отладка никогда не повредит вашей оптимизации, но противоположная ложь, и использование -O3
может привести к ухудшению вашей отладочной информации (например, путем удаления ненужных переменных).
Обратите внимание, что в этом случае может быть лучше использовать -Og
(как указано здесь), так как это будет:
Оптимизируйте опыт отладки. -Og позволяет оптимизировать, что препятствуют отладке. Это должен быть уровень оптимизации выбор для стандартного цикла редактирования-компиляции-отладки, предлагающего разумный уровень оптимизации при сохранении быстрой компиляции и хороший отладочный опыт.
Однако это повлияло бы на производительность, поскольку некоторые оптимизации, которые мешали бы отладке, не выполнялись.
Edit:
Ссылки и цитаты отвечают на ваш вопрос для gcc
. Это может не относиться к другим компиляторам, таким как clang
.
Однако я нашел некоторую документацию и для clang
.
Например здесь:
В принципе, информация об отладке позволяет вам скомпилировать программу с "-O0 -g" и получить полную отладочную информацию, позволяющую произвольно изменить программу, как она выполняется из отладчика. Компиляция программы с "-O3 -g" дает вам полную отладочную информацию, которая всегда доступный и точный для чтения (например, вы получаете точный стек следы, несмотря на устранение хвоста и наложение), но вы можете потерять возможность изменения программы и функций вызова, где оптимизированы из программы или полностью отшлифованы.