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

С++ "inline" - насколько сильный намек на GCC и Clang/LLVM?

В С++ ключевое слово "inline" выполняет две цели. Во-первых, это позволяет определить определение в нескольких единицах перевода. Во-вторых, это подсказка для компилятора, что функция должна быть встроена в скомпилированный код.

Мой вопрос: в коде, создаваемом GCC и Clang/LLVM, имеет ли ключевое слово "inline" любое отношение к встроенной функции? Если да, то в каких ситуациях? Или намек полностью игнорируется? Обратите внимание, что это не вопрос на языке, это вопрос, связанный с компилятором.

4b9b3361

Ответ 1

[Caveat: не гуру С++/GCC] Вы захотите прочитать inline здесь.

Кроме того, это для GCC/C99.

Степень, в которой предложения, сделанные с помощью встроенного функциональный спецификатор эффективен (C99 6.7.4).

  • GCC не будет устанавливать какие-либо функции, если параметр -fno-inline используется или используется -O0. В противном случае GCC могут по-прежнему не функция по многим причинам; Опция -Winline может использоваться для определения того, не была ли функция inlined и почему бы и нет.

Итак, похоже, что, если не используются ваши настройки компилятора (например, -fno-inline или -O0), компилятор принимает подсказку. Я не могу комментировать Clang/LLVM (или GCC на самом деле).

Я рекомендую использовать -Winline, если это не вопрос с кодом и гольф, и вам нужно знать, что происходит.

Ответ 2

Интересное объяснение от gcc: встроенная функция работает так же быстро, как макрос:

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

Обратите внимание, что определенные способы использования в функции может сделать его непригодным для встроенная замена. Среди этих обычаями являются: использование варгаров, использование alloca, использование данных с переменным размером (см. Переменная длина), использование (см. "Ярлыки как значения" ) использование нелокальных goto и вложенных функций (см. Вложенные функции). Использование -Winline будет предупреждать, когда функция, помеченная inline, не может быть заменит, и даст причину для отказа.

В соответствии с требованиями ISO С++, GCC считает функции-члены, определенные в тело класса, которое должно быть отмечено в строке даже если они не указаны явно с ключевым словом inline. Вы может переопределить это с помощью -fno-умолчанию-рядный; см. Опции "Управление диалектом С++".

GCC не выполняет никаких функций, если не оптимизируя, если вы не укажете атрибут `always_inline 'для функции, например:

 /* Prototype.  */
 inline void foo (const char) __attribute__((always_inline)); The remainder of this section is specific

для вставки GNU C90.

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

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

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

Ответ 3

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

Последний, вероятно, лучше всего работает.: -)