Некоторые вызовы не могут быть интегрированы для
различные причины (в частности, звонки
которые предшествуют определению функции
не могут быть интегрированы, и ни один не может
рекурсивные вызовы в пределах
определение) . Если есть
неинтегрированный вызов, то функция
компилируется в ассемблерный код как
обычный. Функция также должна быть
компилируется как обычно, если программа
ссылается на свой адрес, потому что это
не может быть встроено.
Обратите внимание, что некоторые использования в функции
определение может сделать его непригодным для
встроенная замена. Среди этих
использования: использование varargs, использование
alloca, использование данных переменного размера
типы (см. Переменная длина), использование
вычисленный переход (см. Метки как значения),
использование нелокальных goto и вложенных
функции (см. Вложенные функции).
Использование -Winline предупредит, когда
встроенная функция не может быть
подставить, и даст причину
за неудачу.
В соответствии с требованиями ISO C ++, GCC считает,
функции-члены, определенные в
тело класса, помеченное как встроенное
даже если они явно не
объявлено с встроенным ключевым словом. Вы
может переопределить это с
-fno-умолчанию-рядный; см. Параметры управления диалектом C ++.
GCC не выполняет никаких функций, когда
не оптимизировать, если вы не укажете
Атрибут Always_inline для
функция, как это:
/* Prototype. */
inline void foo (const char) __attribute__((always_inline)); The remainder of this section is specific
встраивание в GNU C90.
Когда встроенная функция не является статической,
тогда компилятор должен предположить, что
могут быть звонки из другого источника
файлы; поскольку глобальный символ может быть
определяется только один раз в любой программе,
функция не должна быть определена в
другие исходные файлы, поэтому звонки
в нем нельзя интегрировать.
Следовательно, нестатический встроенный
функция всегда компилируется сама
обычным способом.
Если вы укажете как inline, так и extern
в определении функции, то
Определение используется только для встраивания.
Ни в коем случае функция не скомпилирована на
свой, даже если вы ссылаетесь на его
адрес явно. Такой адрес
становится внешней ссылкой, как будто
ты только объявил функцию,
и не определил его.
Это сочетание встроенного и внешнего
имеет почти эффект макроса.
способ использовать это поставить функцию
определение в заголовочном файле с этими
ключевые слова и поставить еще одну копию
определение (без внутренних и внешних)
в файле библиотеки. Определение в
заголовочный файл вызовет большинство вызовов
к функции, которая будет встроена. Если есть
использование функции остается, они будут
обратитесь к единственному экземпляру в
библиотека.