Чтобы понять «inline», вам нужно понять историю и то, на что была похожа жизнь 20 (и 30) лет назад.
Мы писали код на компьютерах, у которых было мало памяти, поэтому компилятор не мог обрабатывать весь код, составляющий программу, за один раз. Компилятор также был очень медленным, так что вам не нужно было перекомпилировать код, который не изменился - более 24 часов (на компьютере, который стоит более дорогой машины), чтобы перекомпилировать весь код, было нормальным для нескольких проектов, которые я работал над.
Поэтому каждый файл кода был отдельно скомпилирован в объектные файлы. Каждый объектный файл начинался со списка всех содержащихся в нем функций вместе с «адресом» функции. У объектного файла также был список всех функций, которые он вызывал в других объектных файлах, вместе с расположением вызова.
Линкер сначала прочитать все объектные файлы и создать список всех функций , которые они экспортируются вместе с файлом они были в и там адрес. Затем он перечитает все объектные файлы, выведет их в программный файл, обновляя при этом все «внешние» вызовы функций адресом функции.
Компоновщик не изменял и не оптимизировал машинный код, созданный компилятором, никоим образом, кроме как для исправления ссылок на вызовы внешних функций. Компоновщик был частью операционной системы и предшествовал большинству компиляторов. Когда люди писали новый компилятор, им нужно было, чтобы он работал с текущими компоновщиками и имел возможность ссылаться на текущие объектные файлы, иначе системные вызовы не могли быть сделаны.
Компилятор видел только код в файле «.c» или «.cpp», который он компилировал вместе со всеми включенными заголовочными файлами. Поэтому он не мог выполнить какую-либо оптимизацию на основе кода в других файлах «.c» или «.cpp».
Ключевое слово «inline» позволило определить тело функции (метода) в заголовочном файле, что позволило компилятору использовать код функции при компиляции кода, который ее вызывает. Например, скажем, у вас есть класс коллекции, определенный в другом файле .cpp, этот класс будет иметь метод «isEmpty», содержащий одну строку кода, и результирующая программа получит большое ускорение, если вместо вызова функции вызов функции был заменен этой строкой.
В то время ключевое слово «inline» рассматривалось как «дешевый и простой» способ, позволяющий инкапсулировать данные, избегая при этом затрат на вызовы функций, без этого многие программисты имели бы доступ только к закрытым полям объекта. (Макросы, где гораздо хуже «встраивать» код, чем обычно в то время.)
В наши дни «компоновщики» выполняют большую часть оптимизации кода и, как правило, пишутся некой командой как компилятор. Компилятор часто просто проверяет правильность кода и «сжимает» его, оставляя большую часть задачи создания машинного кода компоновщику.