elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con heap, stack
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con heap, stack  (Leído 4,879 veces)
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Duda con heap, stack
« en: 8 Enero 2014, 20:43 pm »

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:
Código:
A a();
A *b=new A();
...

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

Muchas gracias.


« Última modificación: 9 Enero 2014, 23:25 pm por SARGE553413 » En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Duda con heap, stack
« Respuesta #1 en: 8 Enero 2014, 23:59 pm »

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


En línea

SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Duda con heap, stack
« Respuesta #2 en: 9 Enero 2014, 01:09 am »

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.
En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Duda con heap, stack
« Respuesta #3 en: 9 Enero 2014, 04:09 am »

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.
En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Duda con heap, stack
« Respuesta #4 en: 9 Enero 2014, 08:48 am »

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!



En línea

SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Duda con heap, stack
« Respuesta #5 en: 9 Enero 2014, 15:03 pm »

Muchas gracias a todos por la info.

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

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con heap, stack [SOLUCIONADO]
« Respuesta #6 en: 9 Enero 2014, 22:32 pm »

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).
En línea

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

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Duda con heap, stack [SOLUCIONADO]
« Respuesta #7 en: 9 Enero 2014, 23:14 pm »

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.
« Última modificación: 9 Enero 2014, 23:26 pm por SARGE553413 » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con heap, stack [SOLUCIONADO]
« Respuesta #8 en: 10 Enero 2014, 01:18 am »

¿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.

En C++ 11, ¿las funciones lambda se alojan en algún sitio distinto de las funciones normales?
Normalmente es una función normal y corriente.

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?
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:

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.
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.
En línea

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

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Duda con heap, stack
« Respuesta #9 en: 10 Enero 2014, 13:55 pm »

Gracias por las respuestas.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Java heap space
Java
DiTeN 4 6,901 Último mensaje 16 Septiembre 2009, 15:36 pm
por Debci
Heap
ASM
fary 3 2,747 Último mensaje 1 Julio 2012, 13:24 pm
por Eternal Idol
Duda con Stack Pointer (Registro 13)
ASM
JonaLamper 3 1,864 Último mensaje 27 Marzo 2014, 23:50 pm
por cpu2
Duda con la pila (stack)
ASM
exploiterstack 5 3,344 Último mensaje 29 Mayo 2015, 15:15 pm
por cpu2
GC overhead limit excedeed (java heap space excedida)[SOLUCIONADO]
Programación General
Eskizoide 2 1,698 Último mensaje 29 Abril 2018, 22:13 pm
por Eskizoide
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines