Оптимизация и флаги для создания статической библиотеки с 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 на нем.

Какой бы метод вы ни использовали, это вопрос личных предпочтений.