Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: oxydec en 8 Abril 2011, 03:34 am



Título: [?] funciones inline y returns
Publicado por: oxydec en 8 Abril 2011, 03:34 am

Hola, tengo algunas dudas sobre el tema

Inline vs funciones normales :

¿Aparte de incrementar el tamaño del ejecutable tienen alguna otra desventaja frente a las funciones no-inline?

Si el tamaño del ejecutable no es un punto critico, ¿existe alguna razon para no declarar todas las funciones como inline?

tema returns:

Según tengo entendido las funciones inline se expanden mas o menos igual que una macro del preprocesador, entonces porque:

Código
  1. inline int sfdf(){ return 0;}
  2.  
  3. int main(){
  4.  int a = sfdf(); // ok
  5.  // no es lo mismo que:
  6.  int b = return 0; // peta
  7. }
  8.  
?

Corregidme si me equivoco pero el return supongo que lo que hace es poner el valor de retorno en la pila, asi que por ahi se pierde eficiencia no? Por lo tanto en aquellos casos en que sea posible y el tiempo de ejecucion un factor critico, seria mejor usar macros del preprocesador?


Título: Re: [?] funciones inline y returns
Publicado por: Akai en 8 Abril 2011, 08:45 am
Tema ventajas:

Las funciones inline tienen la ventaja de no tener la sobrecarga de saltar a la función, apilar los argumentos, luego retornar, desapilar y volver a saltar a donde estábamos.

Como se podrá ver, para funciones cortas, esto supone una gran ventaja.

Código
  1. bool positivo(int i){
  2. return i>0;
  3. }

Código
  1. inline bool positivo2(int i){
  2. return i>0;
  3. }

la función positivo va a tardar posiblemente más en realizar todo el tema de apilado y return, que la comparación. El inline te salva eso.

Añado algo: Según las optimizaciones con las que compiles, funciones sin inline definidas e implementadas en el mismo lugar, pueden ser convertidas en inline.



Tema returns:

Las funciones inline, se expanden como si fuesen macros, si. PERO lo hacen de una forma oscura y "misteriosa"

Tu ejemplo del return, no es correcto por el hecho que return devuelve a la función superior a la actual, no en la que te encuentras.
Código
  1. b=sfdf();
Eso si sería correcto para obtener un 0 en b.

Como ya he dicho, las funciones inline se expanden de forma similar a las macros, PERO con mucha diferencia. En este tema comentaba eso:
http://foro.elhacker.net/programacion_cc/estoy_aprendiendo-t322048.0.html

Por otro lado, no tengo el conocimiento certero de como se expanden las funciones inline, pero una aproximación podria ser esta:
Código
  1. b=sfdf();
  2. //se traduce por -->
  3. {b=0}

Posiblemente los return se asignen dentro del código "empotrado" del inline a la variable que va a ser asignada. El código de la función, obviamente estará entre llaves.

Por otro lado, tenemos que pensar, que esto al fin y al cabo es trabajo del preprocesador, que simplemente traducirá esto a un código encerrado entre llaves (recordemos que esto crea el mismo tipo de ámbito de variables que en una función) en vez de una llamada a la misma.

De esta forma, el compilador, traducirá eso a código "llano" en vez de un salto a otra posición del código.