Las funciones inline han venido de alguna manera, a reemplazar las macros de preprocesador. No es que esta fuera la finalidad al crearlas (realmente no lo sé), pero la utilidad es básicamente la misma, aunque las funciones inline tienen ventajas sobre las macros.
Bueno, empecemos: ¿qué hace un función inline? Cuando declaramos una función con el calificador inline, el compilador intentará -llegado el momento- de colocar una copia del código de la función en el lugar de la llamada a dicha función en línea). Esto reduce la sobrecarga que se genera cuando llamamos a funciones, pero a costa de incrementar el tamaño del programa por el hecho de tener una copia de la función en cada lugar en que la llamamos.
Es lo mismo que logramos cuando utilizamos las macros de preprocesamiento para expandir código en línea. Acá se puede ver:
#include <iostream>
using namespace std;
#define macroCubo(x) (x)*(x)*(x)
inline int funcCubo(int x)
{
return x*x*x;
}
int main(void)
{
cout << endl << "Con macro: " << macroCubo(2+1);
cout << endl << "Con inline: " << funcCubo(2+1);
/*
La linea 10 queda finalmente como:
cout << endl << "Con macro: " << (2+1)*(2+1)*(2+1);
La linea 11 queda finalmente como:
cout << endl << "Con inline: " << 3*3*3;
*/
}
Aunque el resultado funcional es el mismo, existen diferencias entre los dos métodos:
- Las funciones inline, al ser como cualquier otra función, conlleva una verificación de tipo, cosa que no sucede con las macros, ya que se reemplazan "sin más".
- Las funciones inline no pueden utilizarse de forma sintácticamente incorrecta, ya que esto produciría un error de compilación. Con las macros, es posible sufrir ciertos efectos colaterales por mal uso.
- Las macros no puede ser depuradas, ya que para el precompilador son solo porciones de texto que deben reemplazarse donde se indique. El compilador puede informar un error, pero no podrá decir que se debe a una macro, ni a cual. Por el contrario, las funciones inline se puede depurar como cualquier otra función.
- Las macros reemplazan los argumentos con los parámetros sin evaluar (ver imagen de arriba). En cambio, las funciones evalúan los parámetros (si se tratá de una expresión matemática, por ejemplo, esta se resuelve y se pasa).
Sobre el uso de las funciones en línea, vale aclarar algunas cositas:
- Cada vez que se modifica una función inline, es necesario recompilar todos los archivos que la utilizan (recordemos que se trata de copiar y pegar el cuerpo de la función; y si ésta se moficia, hay que volver a copiar y pegar).
- Se recomienda utilizar el calificador sólo en las funciones pequeñas (aunque tengo entendido que el compilador lo ignora si la función es relativamente grande).
- Existe una sobrecarga cuando se llama a una función cualquiera, la cual se evita utilizando funciones inline, mejorando el tiempo de ejecución.
Los aspectos a tener en cuenta son:
- Se reduce tiempo de ejecución, probablemente a costa de aumentar el tamaño del programa. Es necesario evaluar este punto si queremos, por ejemplo, programar sistemas embebidos ya que usualmente el espacio suele ser un factor crítico en estos.
- Las variables que se agregan por las funciones en línea pueden necesitar registros adicionales, y si no se dispone de suficientes, entonces se requerirá más accesos a memoria RAM, incrementando así el tiempo de ejecución.
- Si el código del programa crece demasiado, pueden superarse las limitaciones de recursos (como memoria RAM) y fallar el programa. Esto es importante sobre todo en sistemas de recursos más limitados, como embebidos, móviles, etc.
Salutes!
No hay comentarios:
Publicar un comentario
Comments are subject to moderation, only in order to avoid insults and disguising things.
Los comentarios están sujetos a moderación, solo con el fin de evitar insultos y cosas por el estilo.