C ++, tienda libre frente a montón

124

new/deleteSe dice que las asignaciones dinámicas con tienen lugar en la tienda gratuita ,
mientras que las malloc/freeoperaciones usan el montón .

Me gustaría saber si existe una diferencia real en la práctica.
¿Los compiladores hacen una distinción entre los dos términos? ( Almacén y montón gratuitos , no new/malloc)

Nick Dandoulakis
fuente

Respuestas:

76

Ver http://www.gotw.ca/gotw/009.htm ; puede describir las diferencias entre el montón y la tienda gratuita mucho mejor que yo:

Tienda libre:

La tienda libre es una de las dos áreas de memoria dinámica, asignada / liberada por nuevo / borrar. La vida útil del objeto puede ser menor que el tiempo que se asigna el almacenamiento; es decir, se puede asignar memoria a los objetos de almacenamiento libre sin que se inicialicen inmediatamente y se pueden destruir sin que la memoria se desasigne inmediatamente. Durante el período en el que se asigna el almacenamiento, pero fuera de la vida útil del objeto, se puede acceder al almacenamiento y manipularlo a través de un vacío *, pero no se puede acceder a ninguno de los miembros no estáticos del protoobjeto ni a las funciones de los miembros, ni se pueden tomar sus direcciones ni manipular de otra manera. .

Montón:

El montón es la otra área de memoria dinámica, asignada / liberada por malloc / free y sus variantes. Tenga en cuenta que, si bien un compilador en particular puede implementar el nuevo y eliminar global predeterminado en términos de malloc y gratis, el montón no es lo mismo que el almacenamiento libre y la memoria asignada en un área no se puede desasignar de manera segura en el otro. La memoria asignada del montón se puede utilizar para objetos de tipo de clase mediante la colocación: nueva construcción y destrucción explícita. Si se usa así, las notas sobre la vida útil del objeto de la tienda gratuita se aplican de manera similar aquí.

Michael Koval
fuente
23
Estoy en desacuerdo. La palabra "montón" en el contexto de la asignación dinámica no se usa ni en el estándar C ++ ni en C99 (no tengo C89 al que se refiere C ++, no dude en corregirme si usa la palabra). No pude encontrar la fecha en que se publicó el GotW en cuestión, pero dado que habla sobre el borrador, obviamente es anterior al estándar.
Avakar
2
Todo esto es cuestión de terminología, en mi humilde opinión. Diga, señor. Stroustrup no distingue 'heap' y 'free store': stroustrup.com/Programming/17_free_store.ppt , diapositiva 12. 'Heap' se usó como sinónimo de memoria dinámica mucho antes de C ++, desde Lisp time (1960s) que usaba estructura de datos del montón para la asignación de memoria.
Alexey Voytenko
En general, pienso en el montón (a través de maloc / free) como una especie de proveedor de materia prima. Pides un trozo de memoria, no lo consigues sin lujos. Tienes que construir las estructuras tú mismo. Free Store (nuevo / eliminar) es más como un proveedor de 'productos terminados'. Usted solicita un objeto y se le asigna algo de espacio, y el objeto que construyó y preparó para su uso. Cuando termina, se limpia muy bien.
Anshuman Kumar
67

Para C ++, la diferencia entre la tienda gratuita y el montón se ha vuelto puramente conceptual. Como un frasco para recolectar errores y otro para recolectar galletas. Uno está etiquetado de una forma, la otra de otra. Esta designación está destinada a aclarar que NUNCA mezclará " new" y " delete" con " malloc", " realloc" o " free" (o conjuntos de niveles de bits para el caso).

Durante las entrevistas es bueno decir que " newy deleteuse la tienda gratuita, mallocy freeuse el montón; newy deletellame al constructor y al destructor, respectivamente, sin embargo, mallocy freeno lo haga". Sin embargo, a menudo escuchará que los segmentos de memoria están realmente en la misma área; sin embargo, que PUEDE ser específico del compilador, es decir, es posible que ambos puedan designar diferentes espacios de memoria como grupos (no estoy seguro de por qué sería, aunque).

Kit10
fuente
28

La respuesta de Mike Koval cubre bastante bien la teoría. En la práctica, sin embargo, casi siempre son la misma región de memoria; en la mayoría de los casos, si profundiza en la implementación del compilador de new, encontrará llamadas malloc().

En otras palabras: desde el punto de vista de la máquina, heap y free store son lo mismo. La distinción existe dentro del compilador.

Para hacer las cosas aún más confusas, antes de la llegada de C ++, decíamos "montón" en el sentido de lo que ahora se llama "tienda gratuita".

Crashworks
fuente
5

El término "montón" también puede referirse a una estructura de datos particular, pero en el contexto de las operaciones malloc de C ++, libre, nuevo y de eliminación, los términos "montón" y "almacenamiento libre" se utilizan de forma más o menos intercambiable.

Jim Lewis
fuente
3

Se supone que el montón y la tienda gratuita no son interoperables. En contextos restringidos como en los microcontroladores AVR de 8 bits con la biblioteca estándar c ++ 11, ni siquiera se pueden usar en el mismo programa. El almacenamiento libre y el montón hacen sus asignaciones en el mismo espacio de memoria, sobrescribiendo estructuras y datos entre sí. En este contexto, Free store es diferente e incompatible con Heap porque la "nueva / eliminar biblioteca de tienda gratuita" es más simple (y más rápida) que la "biblioteca de montón Malloc / free / realloc / calloc" y, por lo tanto, proporciona enormes ganancias de uso de memoria para el Programador integrado en C ++ (en un contexto en el que solo tiene 512 bytes de RAM).

Consulte la biblioteca estándar c ++ 11/14 de 8 bits en https://github.com/ambroise-leclerc/ETL/tree/master/libstd

Ambroise Leclerc
fuente
2

No recuerdo que el estándar haya mencionado la palabra montón, excepto en las descripciones de funciones de montón como push_heap et al. Todas las asignaciones dinámicas se realizan en la tienda gratuita.

avakar
fuente
1

Free Store es un grupo de memoria dinámica no asignada que se le da a un programa que es utilizado por el programa para la asignación dinámica durante la ejecución del programa. Cada programa se proporciona con un grupo de memoria de pila no asignada que puede utilizar durante la ejecución. Este conjunto de memoria disponible se denomina almacenamiento gratuito del programa. La memoria de almacenamiento libre asignada no tiene nombre.

Sudipto
fuente