Я задаю этот основной вопрос, чтобы сделать записи прямыми. Отнесли этот вопрос и его принятый в настоящее время ответ, что не является убедительным. Однако второй самый голосующий ответ дает лучшее понимание, но не идеальный.
При чтении ниже разделите ключевое слово inline
и концепцию "inlining".
Вот мой прием:
Концепция вставки
Это делается для сохранения служебных данных вызова функции. Это больше похоже на замену кода в стиле макро-стиля. Нечего оспаривать.
Ключевое слово inline
Восприятие A
Ключевое слово
inline
- это запрос к компилятору, обычно используемому для небольших функций, поэтому компилятор может оптимизировать его и совершать быстрые вызовы. Компилятор может игнорировать его.
Я оспариваю это, по следующим причинам:
- Более крупные и рекурсивные функции не встроены и компилятор игнорирует ключевое слово
inline
. - Меньшие функции автоматически устанавливаются оптимизатором независимо от того, какое ключевое слово
inline
указано или нет.
Совершенно ясно, что пользователь не имеет никакого контроля над встроенной функцией с использованием ключевого слова inline
.
Восприятие B
inline
не имеет ничего общего с концепцией inlining. Помещениеinline
впереди большой/рекурсивной функции не поможет, и меньшая функция не понадобится, чтобы быть встроенной.Единственное детерминированное использование
inline
заключается в поддержании Единого Правило определения.
то есть. если функция объявлена с помощью inline
, то только ниже утверждается:
- Даже если его тело найдено в нескольких единицах перевода (например, включите этот заголовок в несколько файлов
.cpp
), компилятор будет генерировать только одно определение и избегать множественной ошибки компоновщика символов. (Примечание. Если тела этой функции различны, то это поведение undefined.) - Тело функции
inline
должно быть видимым/доступным во всех единицах перевода, которые его используют. Другими словами, объявление функцииinline
в.h
и определение в каком-либо одном файле.cpp
приведет к ошибке " undefined" для других.cpp
файлов
Вердикт
Восприятие "А" совершенно неверно, и восприятие "В" совершенно правильно.
В стандарте есть некоторые кавычки, однако я ожидаю ответа, который логически объясняет, является ли этот вердикт истинным или ложным.