inline es una sugerencia al compilador para reemplazar la llamada a la función por su cuerpo (inserción de código). Esto puede acelerar la ejecución (no hay gastos generales por la llamada), pero conduce a un aumento en el tamaño del binario.
Sintaxis:
inline int square(int x) { return x * x; }
El compilador tiene derecho a ignorar inline. Para la visibilidad y la implementación simultáneas de la función en diferentes archivos, se utiliza:
// header.h inline int min(int a, int b) { return a < b ? a : b; }
Todo el cuerpo de la función debe estar disponible en cada archivo donde se llama a la función inline, es decir, la forma usual es definir la función en el archivo de encabezado.
Si se declara y define una función inline solo en un archivo .c, otros módulos no podrán usarla; se producirán errores de enlace (referencia indefinida).
¿Cuál es la diferencia entre tales declaraciones en el archivo de encabezado?
inline int foo(int x) { return x + 1; } static inline int bar(int x) { return x + 1; }
inline int foo(...) hace que la función pueda tener múltiples definiciones débiles (una regla de definición). Si se incluye el mismo encabezado en varios archivos .c, el enlazador puede generar un error de definición múltiple.static inline hace que la función sea interna para cada módulo: cada punto de conexión recibe su propia copia, no habrá problemas en la etapa de enlace. Esto es lo más seguro para las funciones inline en los encabezados.Historia
En la biblioteca de funciones matemáticas, se definieron muchos helpers inline en un archivo .c. Al intentar utilizarlos desde otros módulos, surgieron errores de enlace porque las definiciones solo eran visibles en un archivo objeto.
Historia
Después de mover las funciones inline del archivo .c al encabezado, el proyecto comenzó a fallar en la etapa de enlace: el enlazador se quejaba de definiciones múltiples de la misma función. Se solucionó reemplazando por static inline en los archivos de encabezado.
Historia
Al optimizar un algoritmo interno, se utilizó inline para funciones "críticas", esperando aceleración. Pero el compilador ignoró la sugerencia, y el perfilador mostró que los costos de llamada no disminuyeron. El problema se resolvió solo después de un análisis manual de las opciones de optimización del compilador.