Подтвердить что ты не робот

Как заставить gcc встроить функцию?

Заставляет ли функция __attribute__((always_inline)) встраивать функцию gcc?

4b9b3361

Ответ 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

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