Funciones inline — son funciones para las que el compilador puede (pero no está obligado a) reemplazar la llamada por la inserción directa del código de la función en el lugar de la llamada. Para esto se utiliza la palabra clave inline.
inline le da al compilador un consejo, pero no una obligación: puede ser ignorada si la función es demasiado compleja.Limitaciones y riesgos:
Ejemplo:
inline int add(int a, int b) { return a + b; } struct X { int get() const { return value; } int value; }; // get() se considerará como inline
Pregunta: ¿Garantiza la palabra clave inline que la función será incrustada en todos los puntos de llamada?
Respuesta: No. El compilador toma la decisión de la sustitución de la función inline por sí mismo, basándose en heurísticas internas. inline es solo una recomendación.
Historia
En un sistema financiero, se escribió un logger de uso frecuente con docenas de grandes funciones inline. Después de que el sistema creció, el tamaño del binario aumentó drásticamente, lo que llevó a un incremento en el tiempo de enlace y a una disminución de la efectividad de la caché en el servidor.
Historia
Al migrar software multiplataforma, se descubrió que algunos compiladores (por ejemplo, MSVC y GCC) manejan inline de manera diferente: algunas funciones no se expandían inline, mientras que otras sí, lo que causaba diferencias difíciles de reproducir en la velocidad y tamaño de las aplicaciones entre plataformas.
Historia
Un desarrollador declaró funciones inline solo en el archivo de encabezado, pero la implementación la movió a un archivo cpp separado. Como resultado, al enlazar surgieron errores de definición múltiple o external no resuelto, ya que las funciones inline deben ser definidas precisamente en los encabezados.