Para entender “inline”, você precisa entender a história e como era a vida há 20 (e 30) anos atrás.
Estávamos escrevendo código em computadores com pouca memória, portanto não era possível para um compilador processar todo o código que compunha um programa de uma só vez. O compilador também foi muito lento, portanto, você não queria recompilar o código que não havia sido alterado - levando mais de 24 horas (em um computador que custa mais que um carro de ponta) para recompilar todo o código normal em alguns projetos trabalhou em.
Portanto, cada arquivo de código foi compilado separadamente em um arquivo de objeto. Cada arquivo de objeto começou com uma lista de todas as funções que continha, juntamente com o "endereço" da função. Um arquivo de objeto também tinha uma lista de todas as funções que chamava em outros arquivos de objeto, juntamente com o local da chamada.
Um vinculador primeiro lê todos os arquivos de objetos e cria uma lista de todas as funções exportadas, juntamente com o arquivo em que estão e o endereço. Em seguida, ele releria todos os arquivos de objeto, enviando-os para o arquivo de programa, enquanto atualizava todas as chamadas de função “externas” com o endereço da função.
O vinculador não alterou ou otimizou o código de máquina produzido pelo compilador de maneira alguma, a não ser para corrigir referências a chamadas de funções externas. O vinculador fazia parte do sistema operacional e é anterior à maioria dos compiladores. Quando as pessoas escreviam um novo compilador, elas precisavam que ele trabalhasse com os vinculadores atuais e que pudessem vincular aos arquivos de objetos atuais, caso contrário, as chamadas do sistema não poderiam ser feitas.
O compilador só viu o código no arquivo “.c” ou “.cpp” que estava compilando junto com todos os arquivos de cabeçalho incluídos. Portanto, não foi possível fazer nenhuma otimização com base no código em outros arquivos ".c" ou ".cpp".
A palavra-chave “inline” permitiu que o corpo de uma função (método) fosse definido em um arquivo de cabeçalho, permitindo assim que o compilador utilizasse o código da função enquanto compilava o código que a chama. Por exemplo, digamos que você tivesse uma classe de coleção definida no arquivo .cpp, essa classe teria um método "isEmpty", que continha uma linha de código, haveria uma grande aceleração do programa resultante se, em vez de uma chamada para uma função , a chamada de função foi substituída por esta linha.
A palavra-chave “inline” era vista na época como uma maneira “barata e fácil” de permitir o encapsulamento de dados e, ao mesmo tempo, evitar o custo de chamadas de função, sem que muitos programadores tivessem acessado apenas os campos privados do objeto. (Macros onde há uma maneira muito pior de "inserir" o código que era comum na época.)
Atualmente, os “linkers” fazem muita otimização de código e tendem a ser escritos por alguma equipe como compilador. O compilador geralmente verifica se o código está correto e o "compacta", deixando a maior parte da tarefa de criação de código de máquina para o vinculador.