Как заставить gcc встроить функцию? - PullRequest
53 голосов
/ 05 декабря 2011

Вызывает ли __attribute__((always_inline)) функцию, которая будет встроена в gcc?

Ответы [ 8 ]

42 голосов
/ 05 декабря 2011

Да.

Из документации

always_inline

Как правило, функции не являются встроенными, если не указана оптимизация. Для функций, объявленных как встроенные, этот атрибут указывает на функцию, даже если уровень оптимизации не был указан.

29 голосов
/ 01 апреля 2014

Должен. Я большой поклонник ручного встраивания. Конечно, в избытке это плохо. Но часто при оптимизации кода возникают одна или две функции, которые просто необходимо встроить, или производительность падает. И, честно говоря, по моему опыту, компиляторы C обычно используют , а не встроенные функции при использовании встроенного ключевого слова.

Я совершенно готов позволить компилятору встроить большую часть моего кода для меня. Меня волнуют только те полдюжины или около того абсолютно жизненно важных дел. Люди говорят, что «компиляторы хорошо справляются с этим». Я хотел бы увидеть доказательства этого, пожалуйста. До сих пор я никогда не видел, чтобы компилятор C встроил жизненно важный фрагмент кода, о котором я говорил, без использования какого-либо принудительного встроенного синтаксиса (__forceinline в msvc __attribute__((always_inline)) в gcc).

24 голосов
/ 05 декабря 2011

Да, будет. Это не значит, что это хорошая идея.

11 голосов
/ 11 декабря 2011

В соответствии с документацией gcc optimize , вы можете настроить встраивание с параметрами:

-finline-limit=n
By default, GCC limits the size of functions that can be inlined. This flag 
allows coarse control of this limit. n is the size of functions that can be 
inlined in number of  pseudo instructions.

Inlining is actually controlled by a number of parameters, which may be specified
individually by using --param name=value. The -finline-limit=n option sets some 
of these parameters as follows:

    max-inline-insns-single is set to n/2. 
    max-inline-insns-auto is set to n/2.

Я предлагаю прочитать более подробно обо всех параметрах для встраивания и настроить их соответствующим образом.

3 голосов
/ 05 декабря 2011

Да.Он будет встроен в функцию независимо от любых других установленных параметров.Смотрите здесь .

1 голос
/ 26 июня 2017

Хочу добавить, что у меня есть математическая библиотека SIMD, в которой встраивание абсолютно необходимо для производительности.Первоначально я установил все функции как встроенные, но разборка показала, что даже для самых тривиальных операторов будет принято решение вызвать функцию.И MSVC, и Clang показали это со всеми включенными флагами оптимизации.

Я сделал так, как предлагалось в других публикациях в SO, и добавил __forceinline для MSVC и __attribute__((always_inline)) для всех других компиляторов.Наблюдается постоянное улучшение производительности на 25-35% в различных узких циклах с операциями в диапазоне от базовых умножений до синусов.

Я не понял, почему им было так трудно встроить (возможно, шаблонный код сложнее?) но суть в том, что есть очень допустимые варианты использования для встраивания вручную и огромные ускорения.

Если вам интересно, это то, где я реализовал это.https://github.com/redorav/hlslpp

0 голосов
/ 20 декабря 2014

На самом деле ответ «нет». Все это означает, что функция является кандидатом для встраивания, даже если оптимизация отключена.

0 голосов
/ 08 декабря 2014

Можно также использовать __always_inline. Я использовал это для функций-членов C ++ для GCC 4.8.1. Но не смог найти хорошее объяснение в GCC док.

...