Можно ли переопределить уровень оптимизации -Og GCC с помощью O2 / O3 для отдельной функции или модуля компиляции?
Да и нет. Документация для атрибута optimize
, на которую ссылаются документы прагмы, гласит:
Атрибут optimize
используется для указания того, что функция должна быть скомпилирована с параметрами оптимизации, отличными от указанных в командной строке.
Таким образом, атрибут или прагма переопределяют командную строку. Однако это применимо на уровне отдельных функций, тогда как параметр -Og
имеет как отдельные функции, так и глобальные эффекты :
Как и -O0
, -Og
полностью отключает ряд проходов оптимизации, так что отдельные опции, управляющие ими, не действуют.
Таким образом, хотя использование атрибута или прагмы для установки уровня оптимизации O2
или O3
действительно включает все отдельные оптимизации, включенные в этот уровень, это может не иметь полного эффекта, который устанавливает их в команде линия будет делать.
Обратите внимание также на предостережение докуменов, что
Атрибут optimize
должен использоваться только для целей отладки. Не подходит в производственном коде.
Я полагаю, что вы отлаживаете, так как это цель -Og
, но вы должны взять из этого комментария то, что вы не должны полагаться на эту технику для принудительного выбора параметров оптимизации или выключен. Как вы обнаружили, это может быть не так эффективно или полностью.
Это ожидаемое поведение?
Поведение, которое вы описываете, похоже, согласуется с документами, хотя они не указывают подробности. Однако то, как вы его характеризуете, - это игнорирование прагмы, когда в командной строке задано значение -Og
- это не ожидается, и я думаю, что это не совсем точно.