Funciones en línea en C ++

Funciones en línea en C ++
Cuando se llama a una función normal en C ++, algunos se escuchan solo por llamar a la función. En realidad, llamar a una función lleva tiempo antes de que la función realmente comience a ejecutar. Esta vez entre cuándo se llama a la función y cuando la función realmente comienza a ejecutar se llama tiempo de conmutación. Si la función normal es grande, lo que significa que tardará mucho en ejecutarse, entonces el tiempo de conmutación es relativamente pequeño y el usuario puede ignorarlo. Sin embargo, si la función normal es pequeña, ya que muchas funciones son, entonces el tiempo de conmutación, aproximadamente el mismo para funciones grandes y pequeñas, no debe ignorarse. En muchas situaciones, el tiempo de conmutación es más largo que el tiempo que toma la pequeña función para ejecutarse realmente; En algunos casos, mucho más tiempo.

Para resolver este problema, C ++ usa macro y la función en línea. Una macro es como una función pequeña, pero generalmente es más corta que una función pequeña típica. La macro más larga sigue siendo una "declaración". Un cuerpo de función puede tener más de una declaración. Una pequeña función en línea tiene ventajas sobre una función pequeña normal.

Cuando se define una macro, se llama más tarde en el programa. También se define una función en línea y luego se llama más tarde en el programa. Se define una función normal y luego se llama más tarde en el programa. Todos estos tres tipos se definen y se llaman más tarde en el programa. Cualquiera de ellos puede llamarse más de una vez.

Las funciones macro y en línea pequeñas son diferentes de la función de enfoque normal cuando más tarde están en el programa. El compilador C ++ coloca el código macro definido o el código de función en línea pequeño definido (cuerpo) donde sea que se llame en el programa. Cuando el compilador hace esto, se dice que el compilador ha expandido la macro o la función en línea. Este no es el caso de una función normal. La función normal no se expande, donde se llama.

Mientras que la llamada de una función normal necesita tiempo de cambio, para que la función se afirme correctamente antes de su ejecución, la macro o la función en línea pequeña comienza la ejecución cuando se llama, y ​​no hay tiempo de cambio de tiempo de cambio. Esa es la principal ventaja que la macro y la pequeña función en línea tienen sobre la función normal, i.mi., Se omite el tiempo de cambio.

Este artículo explica las funciones en línea en C ++ en comparación con las macros. Se da una explicación de la macro. Se realiza una comparación de la función en línea y la función normal hacia el final del artículo.

Nota: Se dice que llamar a una macro en un programa está invocando la macro.

Contenido del artículo

  • Introducción - Ver arriba
  • Definición de macros y funciones en línea
  • función en línea y el compilador
  • Comparación de macros y funciones en línea
  • Comparación de funciones en línea y normales
  • Conclusión

Definición de macros y funciones en línea

Variable macro y en línea similar a un objeto
Hay una macro similar a un objeto, y hay una macro de forma de función. En consecuencia, hay variables en línea y funciones en línea. Considere el siguiente programa C ++:

#incluir
usando el espacio de nombres STD;
#Define Var1 "E"
Inline Char var2 = 'e';
int main ()

cout << var1 << endl;
cout << var2 << endl;
regresar 0;

La salida es:

mi
mi

Este programa tiene una macro similar a un objeto y una variable en línea. Cada uno contiene el valor, 'E'. Una macro similar a un objeto comienza con #define y no tiene un indicador de tipo. Una variable en línea comienza con "en línea", y un indicador de tipo lo sigue. Las macros tienen una desventaja en comparación con los tipos en línea porque no indican el tipo. Esto puede conducir a problemas de desajuste de tipo en el programa. En la función Main (), VAR1 y VAR2 son el código de definición de las diferentes variables, respectivamente.

Nota: No está claro si VAR1 contiene un char o una cadena literal. Además, tenga en cuenta que una macro, ya sea como un objeto o como una función, no termina con un punto y coma. Termina presionando la tecla ENTER. Una función variable en línea o en línea termina de su manera normal respectiva.

Función macro y en línea similar a la función
Una macro similar a una función es una macro que toma argumentos. Al igual que la macro similar a un objeto, donde se invoca la macro similar a la función en el programa, el compilador reemplaza la invocación con la definición del código y elimina el tiempo de conmutación (sobrecarga de llamadas de función) en el tiempo de ejecución.

Una función en línea es una función que comienza con "en línea". Tiene una ventaja sobre la macro similar a la función con su tipo de retorno y tipos de argumentos. Una macro similar a una función no tiene tipos de argumentos o tipos de retorno. Su tipo de retorno es el valor final del nombre macro.

El siguiente programa C ++ tiene una macro similar a la función y una función en línea, cada una de las cuales busca el valor máximo de dos argumentos. La función en línea compara dos enteros y devuelve el entero más grande. El valor de retorno de la función en línea se puede asignar a una nueva variable INT. Por otro lado, el valor final de la macro se convierte en el valor de la macro.

#incluir
usando el espacio de nombres STD;
#define maxm (a, b) ((a)> (b) ? (a): (b))
Inline int maxi (int a, int b)
if (a> b)
regresar a;
Si (a < b)
regreso B;
if (a == b)
regresar a;

int main ()

cout << maxM(2.5, 6) << endl;
cout << maxI(3, 7) << endl;
regresar 0;

La salida es:

6
7

Con la macro, los argumentos deben ser de tipos compatibles. Esto le da a la macro un tipo de ventaja sobre la función en línea, cuyos tipos de argumentos deberían ser los mismos, en este caso.

El nombre de la macro es maxm. Los argumentos son A y B. El resto es un tipo de cuerpo de funciones, delimitado por paréntesis. Dice si (a)> (b) es verdadero, entonces A se convierte en el valor de la macro; de lo contrario, B se convierte en el valor de la macro.

función en línea y el compilador

Después de que el compilador sustituye la llamada de función en línea con el código de definición de la función, el programa aún tiene que ejecutarse. La compilación no está ejecutando ni ejecutando el programa. Con la función normal, la sobrecarga (tiempo de conmutación) ocurre cuando se ejecuta el programa (ejecutado). El reemplazo macro o en línea ocurre durante la compilación, que es antes de la ejecución (antes de que el programa se envíe al cliente o al usuario).

Al final, el tiempo de conmutación se omite o se obtiene para macros y pequeñas funciones en línea. Sin embargo, si la función en línea es grande, el compilador decidirá si la función declarada como en línea, en línea o no. Si la función declarada como en línea es grande, es posible que no haya una ganancia significativa para reemplazar ninguna de sus llamadas con el cuerpo de su código de función. En cuanto a los criterios de la decisión del compilador, ver más tarde.

Nota: Una función definida dentro de una definición de clase es una función en línea precedida por el especificador en línea.

Comparación de macros y funciones en línea

La macro puede funcionar con diferentes tipos siempre que sean compatibles. Esta es una ventaja. Sin embargo, eso también conduce a efectos secundarios, lo que luego le da una desventaja. La función en línea probará la validez de sus tipos de argumentos antes de usar los argumentos, lo que evita los efectos secundarios.

Comparación de funciones en línea y normales

Ventajas de la función en línea

  • No hay una sobrecarga de llamadas de función (sin tiempo de conmutación).
  • También hay sobrecarga cuando regresa una función normal. Con la función en línea, no hay sobrecarga de llamadas de retorno.
  • Existe una posible optimización específica del contexto del cuerpo de funciones con la función en línea.

Desventajas de la función en línea

  • Para cada llamada de la función en línea, el código de definición de función (cuerpo) se repite (el compilador se vuelve a contar). Esto puede conducir a un archivo muy grande y binario (compilado).
  • El compilador tarda mucho en compilar, ya que repite el mismo código para todas las llamadas.

Las funciones en línea pueden no ser necesarias para muchos sistemas integrados porque un tamaño de programa más pequeño es preferible a una velocidad más alta.

Hay otras desventajas; ver más tarde.

Conclusión

La función en línea es como una macro. Sirven al mismo propósito. El código de definición reemplaza cada llamada de invocación o función. Sin embargo, una función en línea tiene más ventajas sobre la macro. Existe la macro similar a un objeto, y correspondientemente hay la variable en línea. Existe la macro similar a la función, y correspondientemente existe la función en línea. Una función definida dentro de una definición de clase es una función en línea, ya sea que el especificador en línea lo precede o no.

Para definir una macro similar a un objeto o una macro similar a una función, preceda con #define seguido del nombre macro. La macro no especifica su tipo de valor o tipos de argumentos. Para definir una variable en línea o una función en línea, precedirla con el especificador, en línea, seguido del tipo de retorno, y luego el nombre. Para la función en línea, tanto el tipo de retorno como los tipos de argumentos son precisos. Se evitan los efectos secundarios.

La función en línea tiene ventajas generales sobre la macro. Hay pros y contras cuando la función en línea se compara con la función normal.