new/delete
Se dice que las asignaciones dinámicas con tienen lugar en la tienda gratuita ,
mientras que las malloc/free
operaciones 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
)
fuente
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 "
new
ydelete
use la tienda gratuita,malloc
yfree
use el montón;new
ydelete
llame al constructor y al destructor, respectivamente, sin embargo,malloc
yfree
no 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).fuente
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á llamadasmalloc()
.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".
fuente
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.
fuente
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
fuente
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.fuente
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.
fuente