Оптимизация и флаги для создания статической библиотеки с g++

Я только начинаю с компилятора g ++ для Linux и получил несколько вопросов о флагах компилятора. Вот они

Оптимизации

Я читал про флаги оптимизации -O1, -O2 а также -O3 на странице руководства g ++. Я не понял, когда использовать эти флаги. Обычно какой уровень оптимизации вы используете? Руководство g ++ говорит следующее для -O2,

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

Если он не выполняет встраивание и развертывание циклов, как достигается указанная производительность, и рекомендуется ли этот вариант?

Статическая библиотека

Как мне создать статическую библиотеку, используя g++? В Visual Studio я могу выбрать проект библиотеки классов, и он будет скомпилирован в файл "lib". Что эквивалентно в g++?

5 ответов

Правило большого пальца:

Когда вам нужно отладить, используйте -O0 (и -g для генерации символов отладки.)

Когда вы собираетесь отправить его, используйте -O2.

Когда вы используете gentoo, используйте -O3...!

Когда вам нужно поместить его во встроенную систему, используйте -Os (оптимизируйте по размеру, а не по эффективности.)

Руководство gcc перечисляет все подразумеваемые опции для каждого уровня оптимизации. На O2 вы получаете такие вещи, как постоянное свертывание, прогнозирование ветвлений и совместную работу, которые могут существенно изменить скорость вашего приложения в зависимости от вашего кода. Точные параметры зависят от версии, но они подробно описаны в документации.

Для создания статической библиотеки вы используете ar следующим образом:

ar rc libfoo.a foo.o foo2.o ....
ranlib libfoo.a

Ранлиб не всегда необходим, но нет причин не использовать его.

Относительно того, когда использовать какой вариант оптимизации - единого правильного ответа нет.

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

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

Лучше всего измерять и оптимизировать все, что вам нужно. Попробуйте, измерить и решить.

Одно важное практическое правило - чем больше оптимизаций выполняется в вашем коде, тем сложнее отладить его с помощью отладчика (или прочитать его разборку), потому что исходное представление C/C++ удаляется от сгенерированного двоичного кода. По этой причине рекомендуется работать с меньшим количеством оптимизаций при разработке / отладке.

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

Чтобы создать статическую библиотеку, используйте "g++ -c" для генерации.o файлов и "ar" для архивирования их в библиотеку.

Что касается вопроса о статической библиотеке, то ответ, данный David Cournapeau, является правильным, но вы можете альтернативно использовать флаг 's' с 'ar' вместо запуска ranlib в файле статической библиотеки. Страница руководства 'ar' гласит, что

Запуск ar в архиве эквивалентен запуску в нем ranlib.

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

Другие вопросы по тегам