Я задаю этот основной вопрос, чтобы внести ясность. Отправили этот вопрос и принятый в настоящее время ответ, который неубедителен. Однако второй по количеству голосов ответ дает лучшее понимание, но тоже не идеально.
Читая ниже, различите inline
ключевое слово и «встраивание» концепции.
Вот мой вывод:
Концепция встраивания
Это сделано для экономии накладных расходов на вызов функции. Это больше похоже на замену кода в макро-стиле. Нечего оспаривать.
Ключевое слово inline
Восприятие А
Ключевое слово
inline
- это запрос к компилятору, который обычно используется для небольших функций, чтобы компилятор мог оптимизировать его и выполнять более быстрые вызовы. Компилятор может игнорировать это.
Я оспариваю это по следующим причинам:
- Более крупные и рекурсивные функции не встраиваются, и компилятор игнорирует ключевое слово
inline
. - Меньшие функции автоматически встраиваются оптимизатором независимо от того, упоминается ключевое слово
inline
или нет.
Совершенно ясно, что пользователь не имеет никакого контроля над встраиванием функций с использованием ключевого слова inline
.
Восприятие B
inline
не имеет ничего отношения к концепции встраивания. Помещениеinline
перед большой / рекурсивной функцией не поможет, да и функциям меньшего размера он не понадобится для встраивания.Единственное детерминированное использование
inline
- поддержание правила единого определения.
т.е. если функция объявлена с inline
, то только требуются следующие вещи:
- Даже если его тело находится в нескольких единицах перевода (например, включает этот заголовок в несколько файлов
.cpp
), компилятор сгенерирует только одно определение и избежит ошибки компоновщика нескольких символов. (Примечание: если тела этой функции отличаются, то это неопределенное поведение.) - Тело функции
inline
должно быть видимым / доступным для всех единиц перевода, которые его используют. Другими словами, объявлениеinline
функции в.h
и определение в любом.cpp
файле приведет к «неопределенной ошибке компоновщика символов» для других.cpp
файлов.
Вердикт
Восприятие «А» полностью неправильное, а восприятие «Б» полностью правильное.
В стандарте есть несколько цитат по этому поводу, однако я ожидаю ответа, который логически объясняет, верен этот вердикт или нет.
static inline
и поместить его в заголовок. Это заставит компилятор использовать эту функцию в каждой единице перевода отдельно. - person Luka Rahne   schedule 20.11.2014inline
и поместить его в заголовок, без странной ситуации наличия нескольких версий функции (с разными адресами и отдельными копиями статических переменных). - person Mike Seymour   schedule 20.11.2014static
важно сделать эти функции, определенные в разных ЕП, на самом деле совершенно разными функциями. В противном случае они все равно должны были бы быть идентичными. - person Deduplicator   schedule 20.11.2014inline
напоминает компилятору о необходимости встроить функцию в режим отладки или когда оптимизация отключена. Для более высоких уровней оптимизации компилятор может встраивать небольшие функции независимо от того, используется ключевое словоinline
или нет. Помните, что ключевое словоinline
также можно использовать с автономными функциями. У меня эта концепция работает над компилятором IAR EWARM. - person Thomas Matthews   schedule 20.11.2014inline
не гарантирует какой-либо эффект по стандарту, но компиляторы могут гарантировать любой эффект, который они хотят. Поэтому неправильно говорить, чтоinline
не влияет на встраивание, только то, что не гарантируется какой-либо эффект - но все же может! - person cdhowie   schedule 21.11.2014