Duda con heap, stack

Iniciado por SARGE553413, 8 Enero 2014, 20:43 PM

0 Miembros y 1 Visitante están viendo este tema.

SARGE553413

Hola a todos.

He estado leyendo acerca del modelo de memoria de C++, para saber bien como funciona el lenguaje y sacarle mas rendimiento a los programas.
http://www.zator.com/Cpp/E5_1_5.htm

Lo mas importante que he entendido hasta ahora, es que las variables locales automáticas van a la pila(stack) y el resto al montón(heap). La pila es manejada directamente por la UCP, ¿ésto implica mas velocidad? ¿Son realmente los movimientos en la pila considerablemente mas rápidos que en el montón?

Dicho esto, he leído que al declarar variables automáticas estas son creadas en la pila o en un "registro". ¿Ese "registro" es un registro de procesador?

Si tengo una clase "A" creada por mí con un constructor sin params., si hago:

A a();
A *b=new A();
...


¿Los accesos al objeto 'a' serán mas rápidos que los accesos al objeto 'b'?

Muchas gracias.

naderST

Si entendí bien la velocidad de acceso sería la misma tanto en el heap como en el stack, pero al momento de reservar espacio en el stack sería mucho más rápido ya que es solo mover el SP (stack pointer) en el heap se manejan listas enlazadas y esto tomaría más tiempo.

Con respecto al tipo de almacenamiento de las variables register lo que hace es decirle al compilador que trate de mantener ésta variable en los registros del procesador ya que será utilizada con mucha frecuencia.

Fuente:
http://stackoverflow.com/questions/161053/c-which-is-faster-stack-allocation-or-heap-allocation
http://stackoverflow.com/questions/578202/register-keyword-in-c

SARGE553413

Hola de nuevo, gracias por la respuesta.

Por mi parte he encontrado esta info en español:

link (tiene espacios al final, pero aun asi copiar todo seguido en el navegador):
http://www.zator.com/Cpp/E1_3_2.htm#La pila o stack

Particularmente esta parte:
Los movimientos en el stack son generalmente rápidos, a veces basta una simple instrucción del procesador para almacenar o borrar algo en la pila.  Los objetos colocados en ella se asocian a una duración automática .  El término se refiere a que es el compilador el que determina cuando se destruyen.  El lenguaje C++ se caracteriza por hacer un uso extensivo de la pila (muchos objetos son "automáticos" por defecto) y el mecanismo de invocación de funciones se basa en su utilización.  Decimos que C++ es un lenguaje orientado a la pila.

La verdad es que me gustaría mucho tener MUY claro las diferencias entre heap y stack, y como sacarles provecho.
Si alguien lo puede explicar se lo agradeceré enormemente.
Aún así, cualquier link, info etc. la agradeceré también (si es en españo, más)

Muchas gracias.

naderST

Sin duda por lo que he leído la pila (stack) es más rápida que el montón (heap), ahora bien te voy a traducir algo que leí aquí http://stackoverflow.com/questions/3455987/comparison-of-access-performance-of-data-in-heap-and-stack


  • Una ventaja de usar la pila es que es más propensa a estar en la caché a diferencia de un bloque recién reservado en el montón, pero esto sería en la primera ejecución unicament.

  • Reservar memoria en la pila es más "económico" que en el montón porque en la pila simplemente es incrementar el SP (Stack pointer o apuntador de pila) y en el montón se hace de una manera más compleja (si no me equivoco, con listas).

  • Uno de los problemas de usar el montón es la fragmentación y el manejo de la memoria debe hacerse de manera manual.

Sin embargo, el rendimiento de la aplicación no lo define si usas el heap o el stack, ambos tienen su uso, se recomienda que para datos pequeños usar el stack, pero para grandes cantidades de datos usar el heap.

Espero que te sirva la respuesta.

vangodp

Sin embargo si vas a reservar grandes cantidades de memoria no te queda otra que usar el heap.
A no ser que te guste los fuegos artificiales de Windows  :laugh:
Aquí un poco de explicación sobre la memoria en vídeo.
Este es muy importante:
1-http://minidosis.org/C++/Punteros%20y%20Referencias/Mapa%20de%20la%20Memoria%20de%20un%20Proceso/
2-http://minidosis.org/C++/Punteros%20y%20Referencias/El%20Operador%20new/
ya de paso pongo el delete XD
3-http://minidosis.org/C++/Punteros%20y%20Referencias/El%20Operador%20delete/

Este tiene una buena y detallada explicación sobre la memoria:
-http://www.youtube.com/watch?v=DYXBBFai8Eg

PD no se si ya lo has visto, o ignoro por completo si ya sabes como funciona la memoria, no obstante son buenas referencias para saber el por que se usa el tipo de memoria que se usa.
Tu duda es sobre la velocidad, pero creo que no solo de eso se trata la memoria.
Como dije esta también el problema de la cantidad.

Si vas usar pocas variables pues el método de la pila te sirve muy bien, pero si necesitas varios megas la cosa cambia.
Fíate que en uno de los vídeos (el primer si no me equivoco)Pau hace saltar los fuegos artificiales al reservar nama 16 megas  :silbar:
Yo particularmente nunca eh reservado tannnta memoria pero puede pasar.
Espero que te sirva de algo la info, a mi me servio bastante :D
Suerte!




SARGE553413

Muchas gracias a todos por la info.

Si encuentro algo más de interés lo añadiré a este mismo post.

amchacon

Por si sirve, dejo algunas explicaciones que ya hize en el pasado:
http://foro.elhacker.net/programacion_cc/duda_memoria_dinamica_en_c-t391783.0.html
http://foro.elhacker.net/programacion_cc/se_puede_hacer_esto_porque-t389950.0.html (quinto mensaje)

En cuanto a la velocidad, lo más rápido son las variables register. La diferencia entre stack y heap es inapreciable para cualquiera, hay miles de cosas que podrías optimizar antes de eso (las comparaciones, cuantas menos mejor).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

SARGE553413

#7
Gracias de nuevo por la respuesta, lo tengo mucho mas claro. Aunque estoy un poco decepcionado porque pensaba que se podía mejorar el rendimiento del programa usando stack o heap según convenga.

Ahora me asalta otra duda, ¿donde se aloja el código de las funciones que se van creando? En C++ 11, ¿las funciones lambda se alojan en algún sitio distinto de las funciones normales?
Investigando por ahí, he leído que hay que intentar declarar static todas las funciones locales. ¿Se refiere a las funciones que están en el main? ¿Quá pasa con las funciones static, van a zona de memoria distinta de las no static?

PD. Me interesa mucho saber directrices para optimizar al máximo el rendimiento del programa, como saber que hay que hacer las mínimas comparaciones posibles.
Agradeceré cualquier link con información, y como siempre, si es en español, mas todavía.

Saludos.

amchacon

Cita de: SARGE553413 en  9 Enero 2014, 23:14 PM¿donde se aloja el código de las funciones que se van creando?
Antes o después del código del progama.

Cuando se llama a una función, lo que se hace es guardar la dirreción actual y dar un "salto" hacia la dirreción donde está el código de la función, cuando termina vuelve a dar otro salto hacia la dirreción anterior.

Otro tema aparte, son las funciones inline de C++. Son funciones muy cortas y que van precedidas con el modificador "inline", lo que hace el compilador ahí es copiar y pegar el código en todas las llamadas que haya. Así gana un poquito de eficiencia ya que no hay que hacer ningún salto ni nada.

Cita de: SARGE553413 en  9 Enero 2014, 23:14 PMEn C++ 11, ¿las funciones lambda se alojan en algún sitio distinto de las funciones normales?
Normalmente es una función normal y corriente.

Cita de: SARGE553413 en  9 Enero 2014, 23:14 PMInvestigando por ahí, he leído que hay que intentar declarar static todas las funciones locales. ¿Se refiere a las funciones que están en el main? ¿Quá pasa con las funciones static, van a zona de memoria distinta de las no static?
Static sirve para que esa función no sea accesible desde fuera de ese fichero. Se usa en programas multi-archivo.

Más que optimización será por encapsulamiento, aunque no descarto que el compilador pueda hacer alguna optimización (más restricciones, significa mayor libertad para optimizar).

En las funciones que se encuentran en una clase, el static tiene una función totalmente diferente. No confundir :silbar:

Cita de: SARGE553413 en  9 Enero 2014, 23:14 PMPD. Me interesa mucho saber directrices para optimizar al máximo el rendimiento del programa, como saber que hay que hacer las mínimas comparaciones posibles.
Agradeceré cualquier link con información, y como siempre, si es en español, mas todavía.

Saludos.
Los compiladores de hoy en día son muy buenos, y algunas cosas ya las hace si activas el "modo optimización" en las opciones del compilador.

Lo que más se nota es en usar un algoritmo eficiente o poco eficiente.

Una busqueda secuencial en una lista de 1.000.000 elementos, necesitas hacer 1.000.000 iteraciones (como máximo) para encontrar un determinado.

Una busqueda binaria no pasa de 20 iteraciones. Y en el caso de ser palabras de un diccionario, podrías usar un algoritmo de prefijo y encontrar una palabra de 4 letras en 4 iteraciones.

Pasar de 1.000.000 de iteraciones a 4 teraciones es una brutalidad.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

SARGE553413

Gracias por las respuestas.