Заставляет ли функция __attribute__((always_inline))
встраивать функцию gcc?
Как заставить gcc встроить функцию?
Ответ 1
Да.
Из документации
always_inline
Как правило, функции не встроены, если не указана оптимизация. Для функций, объявленных inline, этот атрибут строит функцию, даже если не указан уровень оптимизации.
Ответ 2
Должно. Я большой поклонник ручной вставки. Конечно, используется в избытке, это плохо. Но часто во время оптимизации кода есть одна или две функции, которые просто должны быть встроены или производительность идет в туалет. И, честно говоря, по моему опыту, компиляторы C обычно не встраивают эти функции при использовании ключевого слова inline.
Я совершенно готов предоставить компилятору встроенный код для моего кода. Это всего лишь полдюжины или абсолютно жизненно важных дел, которые мне действительно нравятся. Люди говорят, что "компиляторы хорошо справляются с этим". Пожалуйста, дайте мне подтверждение. До сих пор я никогда не видел, чтобы компилятор С встроил важный фрагмент кода, о котором я ему рассказывал, не используя какой-то принудительный встроенный синтаксис (__forceinline
на msvc __attribute__((always_inline))
на gcc).
Ответ 3
Да, будет. Это не значит, что это хорошая идея.
Ответ 4
В соответствии с документацией gcc optimize options вы можете настроить вложение с параметрами:
-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.
Я предлагаю более подробно ознакомиться со всеми параметрами вложения и соответствующим образом настроить их.
Ответ 5
Да. Он будет встроить функцию независимо от любых других опций. См. здесь.
Ответ 6
Я хочу добавить здесь, что у меня есть SIMD-математическая библиотека, где вложение абсолютно критично для производительности. Первоначально я задал все функции встроенной, но разборка показала, что даже для самых тривиальных операторов она решила бы фактически вызвать функцию. Как MSVC, так и Clang показали это, со всеми флагами оптимизации.
Я сделал, как было предложено в других сообщениях в SO, и добавил __forceinline
для MSVC и __attribute__((always_inline))
для всех других компиляторов. Существовало последовательное 25-35% -ное улучшение производительности в различных жестких циклах с операциями от базового умножения до синусов.
Я не понял, почему у них было такое сложное вложение (возможно, шаблонный код сложнее?), но нижняя строка: есть очень допустимые варианты использования для наложения вручную и огромных ускорений, которые нужно получить.
Если вам интересно, именно там я его реализовал. https://github.com/redorav/hlslpp
Ответ 7
Можно также использовать __always_inline
. Я использовал это для функций-членов С++ для GCC 4.8.1. Но не удалось найти хорошее объяснение в документе GCC.
Ответ 8
На самом деле ответ "нет". Все это означает, что функция является кандидатом для встраивания даже при отключенных оптимизации.