Оптимизация и флаги для создания статической библиотеки с 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.
Какой бы метод вы ни использовали, это просто вопрос личных предпочтений.