2010-01-10 25 views
8

Perdóname si esta es una pregunta tonta, pero me temo que no sé qué es 'la pila'.Lo que, exactamente, es 'The Stack' en lo que respecta a .Net

Sé lo que es 'una pila' y he aprendido los acrónimos FILO/FIFO. Pero cuando la gente dice cosas como 'se asigna un tipo de valor en la pila, no el montón' - Me temo que realmente no sé lo que eso significa.

Cuando introduzco un error de lógica en una función recursiva, no puedo asignar más memoria a 'la pila' y mi aplicación falla ... pero realmente no entiendo de qué se trata.

Traté de encontrar una respuesta para Google, pero solo encontré información sobre 'una pila' y cómo usarla.

Cuando ejecuto una aplicación .Net, ¿crea una sola 'instancia de pila' para actuar como 'The Stack'? He visto rastros de pila que me muestran los niveles de ejecución del código, la mayoría de las veces cuando encuentro una excepción sin manos ... pero todo lo que recuerdo haber podido ver es que los métodos y el orden en que se llamaban ... no lo harían. la pila también tiene todas las variables en el alcance para cada paso de la pila.

Tal vez estoy siendo tonto, pero creo que podría imaginar una situación con una función recursiva en la que sería útil ver el valor anterior de una variable, desde 'la pila' pero sin necesidad de pasar en.

No sé si tiene sentido, es muy tarde. Pero realmente agradecería cualquier información que alguien tenga.

+0

Cuando no puede asignar más memoria, supongo que es causada por tener una recursión infinita, lo que significaría en algún momento, la computadora no tendría suficiente memoria para calcular la recursión. –

+1

La frase * "Un tipo de valor asignado en la pila" * no es del todo exacto. Consulte aquí para obtener más información: http://stackoverflow.com/questions/1130468/memory-allocation-of-value-types-and-reference-types-in-net-framework –

+0

BTW, por "The Heap vs The Stack" , aquí hay un breve resumen: http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html –

Respuesta

18

Ese término hace referencia al call stack. Puede obtener más información sobre los conceptos en un curso de bajo nivel de programación o arquitectura de la computadora/organización, si fuera a tomar uno.

Cada vez que se invoca una función, la dirección de retorno (desde donde se llama), así como los parámetros de la función, se insertan en "la pila" (una pila en la memoria, pero no, no un C# Stack data estructura sobre la que leería en MSDN). Cuando una función finaliza, la dirección se saca de la pila y el control se reanuda donde estaba originalmente (en la dirección mostrada). El conjunto de información perteneciente a una llamada de función (variables locales, dirección de retorno, parámetros, etc.) se denomina "marco de pila".

Por lo tanto, cuando utiliza recursividad (y queda atrapada en un bucle infinito recursivo), literalmente llena la pila con las direcciones de retorno (y otros datos) hasta que no quede espacio.

Editar - Usted mencionó the heap también. Aquí es donde se almacenan las estructuras de datos (asignación de memoria dinámica, a través de la palabra clave new en la mayoría de los idiomas actualmente, o malloc en C). En C/C++, por ejemplo, los datos en el montón están ahí hasta que se liberen explícitamente. Esto debe contrastarse con las variables locales/automáticas que se almacenan en la pila (y por lo tanto se destruyen cuando su alcance termina ... desaparecen de la pila).

+0

Sí, agradecería aclarar las lagunas en mi conocimiento. :) – Sapph

+0

O al menos poner un 2x4 sobre ellos .... –

+0

Muy útil. Gracias –

Cuestiones relacionadas