Оптимизация и флаги для создания статической библиотеки с g ++ - PullRequest
30 голосов
/ 28 апреля 2009

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

Оптимизация

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

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

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

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

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

Ответы [ 5 ]

41 голосов
/ 28 апреля 2009

Эмпирическое правило:

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

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

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

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

6 голосов
/ 28 апреля 2009

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

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

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

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

4 голосов
/ 28 апреля 2009

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

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

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

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

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

2 голосов
/ 28 апреля 2009

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

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

0 голосов
/ 22 января 2016

В отношении вопроса о Статической библиотеке ответ, заданный Дэвидом Курнапо , является правильным, но вы можете альтернативно использовать флаг 's' с 'ar' вместо запуска ranlib в файле статической библиотеки. На странице 'ar' указано, что

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...