¿Por qué se usa el montón de tiempo de ejecución para la asignación dinámica de memoria en lenguajes de estilo C y la estructura de datos llamada "el montón"? ¿Hay alguna relación?
¿Por qué se usa el montón de tiempo de ejecución para la asignación dinámica de memoria en lenguajes de estilo C y la estructura de datos llamada "el montón"? ¿Hay alguna relación?
Respuestas:
Donald Knuth dice (The Art of Computer Programming, Third Ed., Vol. 1, p. 435):
Varios autores comenzaron alrededor de 1975 para llamar al grupo de memoria disponible un "montón".
No dice qué autores y no da referencias a ningún artículo específico, pero sí dice que el uso del término "montón" en relación con las colas de prioridad es el sentido tradicional de la palabra.
Tienen el mismo nombre pero realmente no son similares (incluso conceptualmente). Un montón de memoria se llama montón de la misma manera que se referiría a una cesta de lavandería como un "montón de ropa". Este nombre se usa para indicar un lugar un tanto desordenado donde la memoria se puede asignar y desasignar a voluntad. La estructura de datos (como señala el enlace de Wikipedia al que hace referencia) es bastante diferente.
La colisión de nombres es desafortunada, pero no tan misteriosa. Heap es una palabra pequeña y común que se usa para referirse a una pila, colección, grupo, etc. El uso de la palabra para la estructura de datos precede (estoy bastante seguro) al nombre del grupo de memoria. De hecho, el grupo habría sido una opción mucho mejor para este último, en mi opinión. El montón connota una estructura vertical (como una pila), que se ajusta a la estructura de datos, pero no al conjunto de memoria. No pensamos en un montón de grupo de memoria como jerárquico, mientras que la idea fundamental detrás de la estructura de datos es mantener el elemento más grande en la parte superior del montón (y sub-montones).
La estructura de datos se remonta a mediados de los años 60; amontonar el grupo de memoria, principios de los 70. El término montón (que significa grupo de memoria) fue utilizado al menos ya en 1971 por Wijngaarden en las discusiones sobre Algol.
Posiblemente, el primer uso del montón como estructura de datos se encuentra siete años antes en
Williams, JWJ 1964. "Algoritmo 232 - Heapsort", Comunicaciones del ACM 7 (6): 347-348
En realidad, leer sobre la forma en que se asigna la memoria (ver Bloques de amigos ) me recuerda un montón de estructuras de datos.
En mi opinión, es simplemente un accidente / coincidencia que estas dos cosas completamente no relacionadas tengan el mismo nombre. Es como gráfico y gráfico .
La estructura de datos de tipo montón se utiliza mediante un algoritmo para encontrar la asignación de memoria disponible. Lo siguiente está extraído de http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html .
Cuando
new
se invoca, comienza a buscar un bloque de memoria libre que se ajuste al tamaño de su solicitud. Suponiendo que se encuentre dicho bloque de memoria, se marca como reservado y se devuelve un puntero a esa ubicación. Hay varios algoritmos para lograr esto porque se debe hacer un compromiso entre escanear toda la memoria para encontrar el bloque libre más pequeño más grande que el tamaño de su objeto, o devolver el primero donde la memoria necesita encajar. Para mejorar la velocidad de obtener un bloque de memoria, las áreas de memoria libres y reservadas se mantienen en una estructura de datos similar a los árboles binarios llamados montón.
Los términos coloquiales stack stack y heap memory no se usan en el estándar C ++. El estándar utiliza almacenamiento estático, almacenamiento de subprocesos, almacenamiento automático y almacenamiento dinámico.
Se puede encontrar más en la sección Duración de almacenamiento de la norma.
Por lo tanto, desde el punto de vista del lenguaje y la biblioteca estándar, no hay confusión.
P. ¿Qué es un montón? A. Un montón es una colección de objetos colocados uno encima del otro.
Responda a su pregunta: tanto el almacenamiento dinámico de memoria como el almacenamiento binario utilizan el mismo concepto que usted conoce. Los datos se almacenan en forma de un montón en la memoria en el mismo orden en que están escritos en el programa, mientras que el montón binario es una estructura de datos que sigue el mismo concepto de almacenamiento de datos de forma ordenada en forma de un montón (Datos en la parte superior del otro). Déjame saber lo que piensas en la sección de comentarios.
¿Quizás el primer montón de memoria implementado fue administrado por una estructura de montón?