Значение gcc -O2

Я вижу этот флаг в make файлах. Что это значит и когда его следует использовать?

Ответ 1

Уровень оптимизации 2.

Из справочной страницы GCC:

-O1 Оптимизировать. Оптимизация компиляции занимает несколько больше времени, и много больше памяти для большой функции.

-O2 Оптимизируйте еще больше. GCC выполняет почти все поддерживаемые оптимизации которые не связаны с пространственной скоростью компромисс. Компилятор не выполнять разворачивание или функцию цикла вставляя при указании -O2. В виде по сравнению с -O, этот вариант увеличивается время компиляции и производительность сгенерированного кода.

-O3 Оптимизируйте еще больше. -O3 включает все оптимизации, заданные -O2 и также включает функции -finline-функции, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload и -ftree-vectorize options.

-O0 Сократите время компиляции и сделайте отладку ожидаемой Результаты. Это значение по умолчанию.

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

Ответ 2

Уровень оптимизации 2, макс - 3. См.: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Обратите внимание, что несколько лет назад -O3 может вызвать некоторые сбои, чрезмерно "оптимизируя" код. AFAIK, что уже не соответствует современным версиям GCC. Но с инерцией -O2 считается "максимальным безопасным".

Ответ 3

Это оптимизированный переключатель. См. Gcc -help.

Ответ 4

Пробная manpage?

-O2

Оптимизируйте еще больше. GCC выполняет почти все поддерживаемые   оптимизации, которые не связаны с компрометацией космической скорости.   компилятор не выполняет разворачивание цикла или функцию, когда   вы указываете -O2. По сравнению с -O эта опция увеличивает как   время компиляции и производительность сгенерированного кода.

В человеческих словах: это наивысший по-настоящему безопасный способ оптимизации. -O3 делает реорганизации, которые иногда могут быть неприятными. Субъект как таковой довольно глубокий.

Ответ 5

Компиляторы могут использовать различные методы оптимизации, такие как разворачивание циклов, оптимизация конвейера ЦП, чтобы найти бесполезный код и избежать опасностей данных для ускорения вашего кода. Например, цикл, который выполняется фиксированным количеством раз, будет преобразован в непрерывный код без служебных данных управления циклом. Или, если все итерации цикла независимы, возможна некоторая параллелизация кода.

Установка уровня оптимизации в 2 указывает, сколько энергии должен потратить компилятор для поиска этих оптимизаций. Возможные значения варьируются от 1 до 3

Вы можете узнать больше о том, что компилятор может сделать для оптимизации вашего кода: http://en.wikipedia.org/wiki/Compiler_optimization

Ответ 6

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

По умолчанию оптимизация отключена. Это приводит к самому быстрому времени компиляции, но компилятор абсолютно не пытается оптимизировать, а сгенерированные программы значительно больше и медленнее, чем при оптимизации. Существуют различные переключатели -O (разрешенные формы: -O0, -O1 -O2, -O3 и -Os) в gcc для управления уровнем оптимизации:

-O0 Нет оптимизации; генерирует неоптимизированный код, но имеет самое быстрое время компиляции. Это значение по умолчанию.

-O1 Умеренная оптимизация; оптимизируется достаточно хорошо, но не ухудшает время компиляции. Для больших функций требуется гораздо больше памяти.

-O2 GCC выполняет почти все поддерживаемые оптимизации, которые не связаны с компромиссом по скорости. Компилятор не выполняет циклическую развертку или функцию вставки при указании

-O3 Полная оптимизация, как в -O2; также использует более агрессивную автоматическую вставку подпрограмм в пределах единицы и пытается векторизовать петли. Он также включает функции -finline-функции, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload и -ftree-vectorize options.

-Os Оптимизируйте размер. -O разрешает все оптимизации -O2, которые обычно не увеличивают размер кода. Он также выполняет дальнейшую оптимизацию, предназначенную для уменьшения размера кода.

Подробнее о флажках/опциях, используемых на разных уровнях оптимизации и их деталях: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html