Переменные оптимизированы с помощью g ++ и опции -Og

Когда я компилирую свою программу на C ++ с g++, используя параметр -Og, я вижу переменные, которые равны <optimized out>, а также текущая строка иногда пропускается. Ожидается ли такое поведение на этом уровне оптимизации, или у меня есть проблемы? На странице руководства gcc говорится:

-Og

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

следовательно, я не ожидал такого поведения. В моей системе есть g ++ версии 4.9.2 и gdb версии 7.7.1.


person Svaberg    schedule 15.07.2015    source источник
comment
... предлагая разумный уровень оптимизации ...   -  person Shmil The Cat    schedule 15.07.2015
comment
Компилятору разрешено оптимизировать, пока соблюдается правило as-if. Это может включать удаление переменных (или преобразование в константы), а также удаление неиспользуемых функций.   -  person Thomas Matthews    schedule 15.07.2015
comment
Я понимаю. Моя основная проблема заключается в том, что текущая строка пропускает, входит и выходит из разных функций, чего я не ожидаю / не понимаю. Было бы лучше для меня использовать опцию -O0? Или есть хороший способ разобраться в поведении и придерживаться -Og?   -  person Svaberg    schedule 15.07.2015
comment
Либо используйте -O0, либо просто привыкните к нему   -  person Jonathan Wakely    schedule 15.07.2015
comment
@ShmilTheCat: ... включает оптимизацию, которая не мешает отладке ...   -  person kkm    schedule 17.03.2016
comment
Может его стоит переименовать в -O0.5?   -  person cdyson37    schedule 19.10.2018


Ответы (1)


Это нормальное поведение при компиляции с параметром -Og. На этом уровне оптимизации компилятору разрешается оптимизировать, если он придерживается as -if правило. Это может включать удаление переменных (или преобразование в константы), а также удаление неиспользуемых функций.

Рекомендуется либо привыкнуть к пропуску, либо компилировать с -O0option.

person Svaberg    schedule 15.06.2016
comment
Такое поведение кажется прямым противоречием заявлению в документации о том, что -Og разрешает оптимизацию, не мешающую отладке. Просмотр значений переменных - прекрасный компонент отладки. - person BeeOnRope; 25.10.2017
comment
Разве правило «как если бы» не применимо к любому уровню оптимизации? Это прямо из стандарта и не относится к -Og. Насколько я могу судить, флаг -Og полностью не работает. Это сильно мешает отладке. - person Erik Corry; 21.01.2021