Buscar..


Introducción

Una función definida con el especificador en inline es una función en línea. Una función en línea se puede definir de forma múltiple sin violar la Regla de una definición y, por lo tanto, se puede definir en un encabezado con enlace externo. Declarar una función en línea sugiere al compilador que la función debe estar en línea durante la generación del código, pero no proporciona una garantía.

Sintaxis

  • inline function_declaration
  • inline function_definition
  • class {function_definition};

Observaciones

Generalmente, si el código generado para una función es lo suficientemente pequeño, entonces es un buen candidato para estar en línea. ¿Porque? Si una función es grande y está en línea en un bucle, para todas las llamadas realizadas, el código de la función grande se duplicará, lo que provocará la inflexión del tamaño binario generado. Pero, ¿qué tan pequeño es suficiente?

Si bien las funciones en línea parecen ser una excelente manera de evitar la sobrecarga de las llamadas de funciones, se debe tener en cuenta que no todas las funciones que están marcadas en inline están en línea. En otras palabras, cuando se dice en inline , es solo una sugerencia para el compilador, no un pedido: el compilador no está obligado a incluir la función en línea, es libre de ignorarla, la mayoría lo hace. Los compiladores modernos son mejores para hacer tales optimizaciones que esta palabra clave es ahora un vestigio del pasado, cuando esta sugerencia de función incorporada por el programador fue tomada en serio por los compiladores. Incluso las funciones no marcadas en inline están integradas por el compilador cuando ve beneficio al hacerlo.

Inline como directiva de vinculación

El uso más práctico de inline en C ++ moderno viene de usarlo como una directiva de vinculación. Cuando se define , no se declara, una función en un encabezado que se incluirá en varias fuentes, cada unidad de traducción tendrá su propia copia de esta función que dará lugar a una violación de la ODR (Regla de una definición); esta regla aproximadamente dice que solo puede haber una definición de una función, variable, etc. Para evitar esta violación, marcar la definición de la función en inline hace que la vinculación de la función sea interna.

Preguntas frecuentes

¿Cuándo debo escribir la palabra clave 'en línea' para una función / método en C ++?

Solo cuando desea que la función se defina en un encabezado. Más exactamente solo cuando la definición de la función puede aparecer en varias unidades de compilación. Es una buena idea definir funciones pequeñas (como en un trazador de líneas) en el archivo de encabezado, ya que le da al compilador más información para trabajar mientras optimiza su código. También aumenta el tiempo de compilación.

¿Cuándo no debo escribir la palabra clave 'en línea' para una función / método en C ++?

No agregue en inline cuando crea que su código se ejecutará más rápido si el compilador lo alinea.

¿Cuándo no sabrá el compilador cuándo hacer una función / método en línea?

Generalmente, el compilador podrá hacer esto mejor que tú. Sin embargo, el compilador no tiene la opción de código en línea si no tiene la definición de la función. En el código optimizado al máximo, generalmente todos los métodos privados están en línea, ya sea que lo solicite o no.

Ver también

Declaración de función en línea no miembro

inline int add(int x, int y);

Definición de función en línea no miembro

inline int add(int x, int y)
{
    return x + y;
}

Funciones en línea miembro

// header (.hpp)    
struct A
{
    void i_am_inlined()
    {
    }
};

struct B
{
    void i_am_NOT_inlined();
};

// source (.cpp)    
void B::i_am_NOT_inlined()
{
}

¿Qué es la función en línea?

inline int add(int x, int y)
{
    return x + y;
}

int main()
{
    int a = 1, b = 2;
    int c = add(a, b);
}

En el código anterior, cuando la add está en línea, el código resultante se convertirá en algo como esto

int main()
{
    int a = 1, b = 2;
    int c = a + b;
}

La función en línea no se ve por ninguna parte, su cuerpo se inserta en el cuerpo de la persona que llama. Si el add no estuviera en línea, se llamaría una función. Se debe incurrir en la sobrecarga de llamar a una función, como crear un nuevo marco de pila , copiar argumentos, hacer variables locales, saltar (perder la localidad de referencia y no por falta de caché), etc.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow