2009-08-29 12 views
84

asignaciones dinámicas con new/delete se dice que tiene lugar en el sin tienda de, mientras
malloc/free operaciones utilizan el montón.

Me gustaría saber si hay una diferencia real, en la práctica.
¿Los compiladores hacen una distinción entre los dos términos? (tienda libre y Montón, no new/malloc)C++, Libre-vs tienda Montón

Respuesta

62

Ver http://www.gotw.ca/gotw/009.htm; se pueden describir las diferencias entre la pila y el libre tienda mucho mejor que pude:

libre de la tienda:

La tienda libre es uno de los dos áreas de memoria dinámica, asignada/liberado por nuevo/eliminar. La duración del objeto puede ser menor que el tiempo de almacenamiento asignado ; es decir, los objetos de la tienda libre pueden tener memoria asignada sin que se inicialice inmediatamente, y se puede destruir sin que la memoria sea inmediatamente desasignada. Durante el período cuando el almacenamiento se asigna pero fuera de la vida del objeto, el almacenamiento puede acceder y manipulado a través de un void * pero ninguno de no estáticos miembros del proto-objetos o funciones miembro puede ser visitada, tienen su direcciones tomadas, o manipularse de otra manera.

Heap:

El montón es la otra área de memoria dinámica , asignado/liberado por malloc/libre y sus variantes. Tenga en cuenta que, si bien el valor predeterminado global nuevo y borrar podría ser implementada en términos de malloc y libre por un compilador concreto, el montón no es lo mismo que tienda libre y la memoria asignada en una área no puede ser desasignado con seguridad en el otro. La memoria asignada desde el montón se puede utilizar para objetos de la clase tipo por ubicación-nueva construcción y destrucción explícita. Si así se usa, las notas sobre la vida útil de los objetos de la tienda se aplican de manera similar aquí.

+19

No estoy de acuerdo. La palabra "montón" en el contexto de la asignación dinámica no se utiliza ni con el estándar C++ ni con C99 (no tengo C89 a la que C++ se refiere, no dude en corregirme si usa la palabra). No pude encontrar la fecha en que se publicó el libro en cuestión, pero como se trata del borrador, obviamente es pre-estándar. – avakar

+1

Esta es toda la cuestión de terminología, imho. Digamos que el Sr. Stroustrup no distingue entre 'montón' y 'tienda libre': http://www.stroustrup.com/Programming/17_free_store.ppt, diapositiva 12. 'Heap' se usó como sinónimo de memoria dinámica hace mucho tiempo antes de C++, desde el tiempo de Lisp (década de 1960) que utilizó la estructura de datos del montón para la asignación de memoria. –

1

no recuerdo el estándar mencionar jamás la palabra montón, excepto en las descripciones de las funciones del montón como push_heap et al. Todas las asignaciones dinámicas se realizan en la tienda libre.

+0

Sí, lo siento, todavía no he desayunado :-( –

2

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

14

La respuesta de Mike Koval cubre la teoría bastante bien.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á que llama al malloc().

En otras palabras: desde el punto de vista de la máquina, el montón y la tienda libre son la misma cosa. La distinción existe dentro del compilador.

Para hacer las cosas aún más confusas, antes del advenimiento de C++ dijimos "montón" en el sentido de lo que ahora se llama "tienda gratuita".

41

Para C++, la diferencia entre la tienda gratuita y el montón se ha vuelto puramente conceptual. Como un frasco para recoger errores, y uno para recolectar cookies. Una está etiquetada de una manera, la otra de otra. Esta designación está destinada a llevar a casa el punto de que NUNCA mezcle "nuevo" y "eliminar" con "malloc", "realloc" o "libre" (o conjuntos de niveles de bits para el caso).

Durante las entrevistas, es bueno decir que "nuevo y eliminar utiliza la tienda gratuita, malloc y uso gratuito del montón; nuevo y eliminar llamar al constructor y al destructor, respectivamente, sin embargo malloc y free no lo hacen". Sin embargo, a menudo escuchará que los segmentos de memoria están realmente en la misma área, sin embargo, PUEDE ser específico del compilador, es decir, es posible que ambos puedan designar espacios de memoria diferentes como agrupaciones (no estoy seguro de por qué sería, aunque).

2

El montón y la tienda libre no se supone que sean interoperables. En contextos restringidos como en los microcontroladores AVR de 8 bits con la biblioteca estándar de C++ 11, ni siquiera se pueden usar en el mismo programa. Free store y heap hacen sus asignaciones en el mismo espacio de memoria, sobrescribiéndose entre sí estructuras y datos. En este contexto, la tienda gratuita es diferente e incompatible con Heap porque la "biblioteca de libre/nueva tienda libre" es más simple (y más rápida) que la "biblioteca de montón Malloc/free/realloc/calloc" y proporciona enormes ganancias de uso de memoria el programador incrustado de C++ (en un contexto donde solo tienes 512 bytes de RAM).

Ver 8 bits C++ 11/14 Biblioteca estándar en https://github.com/ambroise-leclerc/ETL/tree/master/libstd

0

tienda libre es un grupo de la pila de memoria no-asignado dado a un programa que se utiliza por el programa para la asignación dinámica durante la ejecución de programa. Cada programa se proporciona con un grupo de memoria de montón no asignado que puede utilizar durante la ejecución. Este grupo de memoria disponible se conoce como almacenamiento gratuito del programa. La memoria de la tienda libre asignada no tiene nombre.