inline
делает две вещи:
- дает освобождение от "одного правила определения" (см ниже). Это всегда.
- Дает компилятору подсказку, чтобы избежать вызова функции. Компилятор может игнорировать это.
# 1 Может быть очень полезным (например, поместить определение в заголовок, если оно короткое), даже если # 2 отключен.
На практике компиляторы часто лучше работают над тем, что делать самостоятельно (особенно если доступна оптимизация с использованием профиля).
[EDIT: полные ссылки и соответствующий текст]
Две точки выше и следует из стандарта ISO/ANSI (ISO/IEC 9899: 1999 (Е), обычно известные как "C99") ,
В §6.9 «Внешнее определение», пункт 5:
внешнее определение является внешним свидетельством того, что является также определение функции (другой, чем определение инлайн) или объекта. Если идентификатор, объявленный с внешней связью, используется в выражении (отличном от части операнда оператора sizeof, результат которого является целочисленной константой), где-то во всей программе должно быть ровно одно внешнее определение для идентификатора; в противном случае должно быть не более одного.
Хотя эквивалентное определение в C++ явно называется Правилом определения (ODR), оно служит той же цели. Внешние элементы (т. Е. Не «статические» и, следовательно, локальные для одного модуля перевода, как правило, одного исходного файла) могут быть определены только один раз только , если только не является функцией и.
В §6.7.4, «Функциональные спецификаторы», рядный ключевое слово определяется:
Выполнение функции инлайн функция предполагает, что вызовы функции быть как можно быстрее. [118] Степень, в которой такие предложения вступают в силу, составляет .
и сноска (ненормативный), но обеспечивает уточнение:
При использовании, например, альтернативой обычного механизма вызова функции, такие как «„инлайн подстановки“». Встроенная подстановка не является текстовой заменой и не создает новую функцию. Поэтому, например, расширение макроса, используемого в теле функции, использует определение, которое оно имело в точке, где отображается тело функции, а не где функция вызывается; и идентификаторы относятся к объявлениям в области, где происходит тело. Аналогично, функция имеет один адрес, независимо от количества встроенных определений, которые встречаются в дополнение к внешнему определению.
Резюме: что большинство пользователей C и C++ ожидают от встроенного не то, что они получают. Его очевидная основная цель - избежать функциональных вызовов, полностью опционально. Но для обеспечения отдельной компиляции требуется релаксация единого определения.
(Все внимание в котировках от стандарта.)
EDIT 2: Несколько замечаний:
- Существуют различные ограничения на внешних встроенных функций. У вас не может быть статическая переменная в функции, и вы не можете ссылаться на объекты/функции объектов статической TU.
- Только что видел это на VC++ «whole program optimisation», который является примером компилятора, который делает свою собственную встроенную вещь, а не автора.
Я подозреваю, что в конце 1980-х годов, как и «регистр», устарел, «inline» устарел уже несколько лет. –
\ o /, die "inline"! – elmarco
Inline определенно не устарел. Вы когда-нибудь читали исходный код для современного ядра? Inline не имеет отношения к людям, которые пишут приложения, но эти люди не должны использовать C в любом случае, и это так же важно для системного программирования, как и когда-либо. – nosatalian