Оптимизация и флаги для создания статической библиотеки с g++
Я только начинаю с компилятора g++ в Linux и задаю некоторые вопросы о флагах компилятора. Вот они
Оптимизация
Я прочитал о флажках оптимизации -O1
, -O2
и -O3
на странице руководства g++. Я не понимал, когда использовать эти флаги. Обычно какой уровень оптимизации вы используете? В руководстве g++ указано -O2
.
Оптимизируйте еще больше. GCC выполняет почти все поддерживаемые оптимизации, которые не связаны с компрометацией космической скорости. Компилятор не выполняет циклическую развёртывание или функцию, когда вы указываете -O2. По сравнению с -O, этот параметр увеличивает как время компиляции, так и производительность сгенерированного кода.
Если он не выполняет inlining и цикл разворачивания, как достигается соответствие производительности, и рекомендуется ли эта опция?
Статическая библиотека
Как создать статическую библиотеку с помощью g++? В Visual Studio я могу выбрать проект библиотеки классов, и он будет скомпилирован в файл "lib". Что эквивалентно в g++?
Ответы
Ответ 1
Эмпирическое правило:
Когда вам нужно отлаживать, используйте -O0 (и -g для генерации отладочных символов.)
Когда вы готовитесь к отправке, используйте -O2.
Когда вы используете gentoo, используйте -O3...!
Когда вам нужно поместить его во встроенную систему, используйте -O (оптимизируйте размер, а не эффективность).
Ответ 2
В руководстве gcc перечислены все подразумеваемые параметры на каждом уровне оптимизации. В O2 вы получаете такие вещи, как постоянное складывание, предсказание ветвей и co, которые могут значительно изменить скорость вашего приложения, в зависимости от вашего кода. Точные параметры зависят от версии, но они документированы очень подробно.
Чтобы создать статическую библиотеку, вы используете ar следующим образом:
ar rc libfoo.a foo.o foo2.o ....
ranlib libfoo.a
Ranlib не всегда необходим, но нет причин не использовать его.
Ответ 3
Относительно того, когда использовать какой вариант оптимизации - нет единого правильного ответа.
Некоторые уровни оптимизации могут время от времени снижать производительность. Это зависит от типа кода, который вы пишете, и от шаблона выполнения, который он имеет, и зависит от конкретного процессора, на котором вы работаете.
(Чтобы дать простой канонический пример - компилятор может решить использовать оптимизацию, которая делает ваш код немного больше, чем раньше. Это может привести к тому, что некоторая часть кода больше не будет вписываться в кеш команд, после чего многие потребуется больше доступа к памяти - например, в цикле).
Лучше всего измерять и оптимизировать все, что вам нужно. Попробуйте, измерить и решить.
Одно важное правило - чем больше оптимизаций выполняется для вашего кода, тем сложнее его отлаживать с помощью отладчика (или читать его разборку), потому что исходное представление C/С++ больше удаляется от сгенерированного двоичного файла. Для разработки/отладки по этой причине хорошим правилом является работа с меньшим количеством оптимизаций.
Ответ 4
Существует много оптимизаций, которые может выполнять компилятор, кроме цикла разворачивания и вставки. Здесь часто упоминаются разворачивание и вставка петли, хотя они делают код быстрее, а также делают его более крупным.
Чтобы создать статическую библиотеку, используйте "g++ -c" для генерации файлов .o и "ar", чтобы архивировать их в библиотеку.
Ответ 5
Что касается вопроса о статической библиотеке, то вопрос, который дает David Curnapeau, является правильным, но вы можете использовать флаг 's' вместо 'ar' вместо запуска ranlib в вашем файле статической библиотеки. На странице 'ar' указано, что
Запуск ar s в архиве эквивалентен запуску ranlib на нем.
Какой бы метод вы ни использовали, это вопрос личных предпочтений.