Para entender "en línea" necesita comprender la historia y cómo era la vida hace 20 (y 30) años.
Estábamos escribiendo código en computadoras que tenían poca memoria, por lo que no era posible que un compilador procesara todo el código que formaba un programa de una sola vez. El compilador también fue muy lento, por lo que no quería tener que volver a compilar el código que no había cambiado: tomar más de 24 horas (en una computadora que costaba más que un automóvil de gama alta) para recompilar todo el código era normal para algunos proyectos. trabajado en.
Por lo tanto, cada archivo de código se compiló por separado en archivos de objetos. Cada archivo de objeto comenzó con una lista de todas las funciones que contenía, junto con la "dirección" de la función. Un archivo de objeto también tenía una lista de todas las funciones que llamó en otros archivos de objeto junto con la ubicación de la llamada.
Un enlazador primero leería todos los archivos de objetos y crearía una lista de todas las funciones que exportaron, junto con el archivo en el que estaban y su dirección. Luego volvería a leer todos los archivos de objetos, enviándolos al archivo de programa, mientras actualiza todas las llamadas de funciones "externas" con la dirección de la función.
El enlazador no modificó ni optimizó el código de máquina producido por el compilador de ninguna otra forma que no fuera para arreglar referencias a llamadas a funciones externas. El enlazador era parte del sistema operativo y es anterior a la mayoría de los compiladores. Cuando las personas escribían un nuevo compilador, lo necesitaban para trabajar con los enlazadores actuales y para poder enlazar con los archivos de objetos actuales, de lo contrario no se podrían hacer llamadas al sistema.
El compilador solo vio el código en el archivo ".c" o ".cpp" que estaba compilando junto con todos los archivos de encabezado incluidos. Por lo tanto, no podría realizar ninguna optimización basada en el código de otros archivos ".c" o ".cpp".
La palabra clave "en línea" permitió que el cuerpo de una función (método) se definiera en un archivo de encabezado, lo que permitió al compilador utilizar el código de la función mientras compilaba el código que la llama. Por ejemplo, digamos que tenía una clase de colección definida en otro archivo .cpp, esta clase tendría un método "isEmpty", que contenía una línea de código, habría una gran aceleración del programa resultante si en lugar de una llamada a una función , la llamada a la función se reemplazó con esta línea.
La palabra clave "en línea" se consideraba en ese momento como una forma "barata y fácil" de permitir la encapsulación de datos y evitar el costo de las llamadas a funciones, sin que muchos programadores hubieran accedido a los campos privados del objeto. (Las macros eran una forma mucho peor de "alinear" el código que cuando era común en ese momento).
En la actualidad, los "enlazadores" optimizan mucho el código y tienden a ser escritos por algún equipo como compilador. El compilador a menudo solo comprueba que el código es correcto y lo "comprime", dejando la mayor parte de la tarea de creación de código de máquina al enlazador.