Inicio > Programación > C++: Funciones inline

C++: Funciones inline

Viernes, 19 de septiembre de 2008 Dejar un comentario Ir a comentarios

Última actualización: 28/07/2009

Muchas veces, revisando código de otra gente, me he encontrado con declaraciones de métodos en clases que tenian delante la palabra clave inline, y hasta ahora no me había dado por buscar el significado de esta peculiaridad. Si la optimización de tus programas es esencial para tí o te pica la curiosidad sigue leyendo esta entrada, si por el contrario vas a realizar aplicaciones grandes donde la velocidad puede quedar en segundo o tercer apartado puede que no te interese.

¿Qué son las funciones en línea?

Las funciones en línea (inline functions) son funciones donde se evita la llamada a dicha función reemplazando el cuerpo de código de ésta en el lugar donde es llamada.

Razones por las que usar las funciones en línea

Normalmente, una llamada a función transfiere el control desde el programa principal a la función y después de la ejecución del cuerpo de la función, el control vuelve al programa que realizó la llamada. Siguiendo este método común de llamadas a funciones (sin la utilización de funciones en línea), ahorramos en espacio de programa y espacio de memoria usado ya que la función reside solamente en un lugar y se ejecuta cuando es llamada. Sin embargo, este concepto de llamadas y ejecución de funciones consume tiempo ya que los registros y otros procesos deben ser salvados antes de que la función sea llamada y restaurados después de que haya sido ejecutada.

Este tiempo extra es válido para funciones muy complejas o en programas muy extensos, pero si la función es corta (pongamos como ejemplo los típicos métodos setters o getters en las clases) el programador podría colocar el código de la función directamente en el código del programa que llama a dicha función. De esta forma, las funciones inline obtienen tiempos de ejecución más bajos, ya que se evitan las llamadas a cada una de este tipo de funciones. No obstante, el abuso de este calificador en ocasiones puede no ser bueno. Por ejemplo, la modificación de una función inline obligaría a recompilar todos los módulos en los que ésta apareciera. Por otra parte, el tamaño del código puede aumentar extraordinariamente. Por todo ello, es recomendable utilizar el calificador inline cuando la función es muy pequeña, o si se llama desde pocos lugares.

En este punto alguien se puede preguntar: ¿Por qué no escribir ese pequeño código en cada parte del programa que me interese en vez de usar estas funciones inline?. Bien, aunque esto se podría realizar perfectamente, seguramente nuestro programa perdería mucha claridad y sería mucho menos legible para cualquier otra persona. Además cuando necesitaramos modificar dicho código tendriamos que recordar todos los lugares de la aplicación donde se encuentra, con el trabajo que ello conlleva.

¿Qué ocurre cuando se escribe una función inline?

La función inline toma el formato de una función normal pero cuando se compila, el código de la función aparece en el lugar donde se realiza la llamada. The inline function takes the format as a normal function but when it is compiled it is compiled as inline code. The function is placed separately as inline function, thus adding readability to the source program. When the program is compiled, the code present in function body is replaced in the place of function call.

Formato general de las funciones en línea

Existen dos formas de utilizar las funciones en línea: de forma explícita y de forma ímplicita. Cuando queremos hacerlo de forma explícita tenemos que poner el clasificador inline delante de la definición de la función. He aquí un ejemplo:

inline int menor (int x, int y)
{
   return ( ( x < y ) ? x : y );
}

El uso de funciones en línea de forma ímplicita se da cuando realizamos la implementación de un determinado método en el fichero de defición de una clase. He aquí un ejemplo:

class Circulo
{
   public:
   Circulo(){}
   ~Circulo(){}

   float getXCenter() const {return _xcenter;}
   float getYCenter() const {return _ycenter;}
   float getRadius() const {return _radius;}
   void setParams(float x, float y, float r);

   private:
   float _xcenter, _ycenter, _radius;
};

Por último, y tras un buen rato peleándome con el compilador he averiguado que cuando definimos métodos inline en una clase, pero definimos el cuerpo de la función en un fichero cpp hay problemas de compilación. Concretamente, si hacemos esto último nos aparecerán errores en el proceso de linkado del tipo “unresolved external”. Para solucionar este problema no nos queda otra que realizar dichas declaraciones dentro del fichero de cabecera.

GD Star Rating
loading...
C++: Funciones inline, 10.0 out of 10 based on 1 rating
Share
Categories: Programación Tags: , ,
  1. CIELO
    Lunes, 20 de octubre de 2008 a las 20:27 | #1
    GD Star Rating
    loading...

    COMO SE PUDE FORMAR UN CUADRO Y UN CIRCULO EN c++

  2. Lunes, 20 de octubre de 2008 a las 20:38 | #2
    GD Star Rating
    loading...

    Abstrayéndose mucho y programando un poco jejeje. En el ejemplo que ves en esta entrada tienes una posible representación de un circulo, para un cuadrado te bastaría almacenar la posición de un vértice y el ancho/alto del mismo.

  3. CIELO
    Martes, 21 de octubre de 2008 a las 20:36 | #3
    GD Star Rating
    loading...

    hay gracias es usted muy amable

  4. CIELO
    Martes, 21 de octubre de 2008 a las 20:36 | #4
    GD Star Rating
    loading...

    fijese que su ayuda me sirvio de muchoooooooooooooo gracias por su consejo

  5. Martes, 21 de octubre de 2008 a las 21:46 | #5
    GD Star Rating
    loading...

    De nada CIELO ;) . Y no me llames de usted, tuteame jeje

  6. CIELO
    Jueves, 23 de octubre de 2008 a las 06:54 | #6
    GD Star Rating
    loading...

    o.k pipponazo usted sabe programar en visual c++

  7. CIELO
    Jueves, 23 de octubre de 2008 a las 06:58 | #7
    GD Star Rating
    loading...

    perdon sabes programar en visual C++ iijjijijiji es que me gustaria saber como hacer un cuadro y un circulo adentro pero con visual c++ cres que me podras desir pero con un r=10 y a=314.16cm2 y p=62.83cm aver si sabe y es muy programador jijijijiijiiij

  8. JORGE
    Sábado, 17 de enero de 2009 a las 20:34 | #8
    GD Star Rating
    loading...

    disculpen me podrian decir cuantas y cuales son las limitantes de las funciones en linea.
    osea de q forma no se podria utilizar una funcion en linea

  9. Martes, 20 de enero de 2009 a las 10:04 | #9
    GD Star Rating
    loading...

    Hola Jorge, la verdad es que no tiene limitaciones estrictas, puedes poner dicha palabra reservada donde quieras, pero hay que hacerlo con cuidado ya que si la pones en todas las funciones que escribas el tamaño final del ejecutable será mayor en aplicaciones grandes.

    Hay que usarlo con cabeza para optimizar el código allá donde creamos conveniente.

  10. papsap rodic
    Lunes, 12 de abril de 2010 a las 14:30 | #10
    GD Star Rating
    loading...

    01 class Circulo
    02 {
    03 public:
    04 Circulo(){}
    05 ~Circulo(){}
    06
    07 float getXCenter() const {return _xcenter;}
    08 float getYCenter() const {return _ycenter;}
    09 float getRadius() const {return _radius;}
    10 void setParams(float x, float y, float r);
    11
    12 private:
    13 float _xcenter, _ycenter, _radius;
    14 };

  11. Viernes, 25 de junio de 2010 a las 18:26 | #11
    GD Star Rating
    loading...

    Es muy interesante tu blog, lo acabo de encontrar pues ando buscando como manejar errores en c (no c++) pero no encuentro un ejemplo claro, habia visto el inline pero nunca le habia puesto mucha atención, gracias por tu aclaración, saludos desde México.

  12. Viernes, 25 de junio de 2010 a las 22:24 | #12
    GD Star Rating
    loading...

    Gracias por tu comentario Manuel. En C no tenemos excepciones por lo que lo general es controlar los errores por los valores retornados por las funciones. También puedes echarle un vistazo a la función assert (http://plagatux.es/2009/07/tip-cc-assert-vs-exception/) que uso bastante.

  13. Viernes, 25 de junio de 2010 a las 23:20 | #13
    GD Star Rating
    loading...

    ok, gracias, voy a darle un vistazo.

  1. Sin trackbacks aún.