diferencia c++ stack heap automatic-storage

c++ - diferencia - stack memory



¿Por qué los términos "automático" y "dinámico" se prefieren a los términos "pila" y "montón" en la administración de memoria de C++? (6)

En relación con muchas preguntas y respuestas sobre SO, he aprendido que es mejor referirse a los objetos cuya vida útil se administra como residir en el almacenamiento automático en lugar de la pila.

Además, los objetos asignados dinámicamente no deben considerarse como residentes en el montón, sino en el almacenamiento dinámico.

Entiendo que hay almacenamiento automático, dinámico y estático, pero en realidad nunca entendí la diferencia entre pila automática y pila dinámica. ¿Por qué se prefieren los primeros?

No estoy preguntando qué significa pila / montón o cómo funciona la administración de memoria. Estoy preguntando por qué los términos almacenamiento automático / dinámico son preferidos sobre los términos pila / pila.


La mayoría de las implementaciones utilizan una pila para respaldar objetos con almacenamiento automático. Esto no es requerido por el estándar, pero funciona bien en la mayoría de las arquitecturas de CPU en estos días.

Las implementaciones utilizan diversas estrategias para respaldar objetos con duración de almacenamiento dinámico. No estoy seguro de que un heap sea ​​la mejor manera de describir lo que usan los asignadores de memoria modernos, pero ese parece ser el término "histórico" para eso.

Por lo tanto, almacenamiento automático / dinámico son términos que los usos estándar clasifican ("abstractos") en el tiempo de vida de los objetos. Esos son los términos apropiados para usar si desea hablar de objetos como los describe el estándar.
Las pilas y los montones son técnicas de implementación ("concretas") que se pueden utilizar para respaldarlas. Usar esos términos es menos correcto, a menos que esté hablando de una implementación específica.


Los términos "duración del almacenamiento estático", "duración del almacenamiento automático" y "duración del almacenamiento dinámico" aparecen en el estándar de C ++.

Los términos "stack" y "heap" se usan para referirse a las características de la biblioteca estándar ( stack<> , make_heap() , push_heap() , etc.) que tienen poco que ver con la duración del almacenamiento.


Los términos de almacenamiento automático / dinámico son preferibles simplemente porque esto es lo que requiere el estándar. La pila / pila están basadas en la implementación y, en teoría, pueden implementarse de otra manera.


Stack y Heap incorporan los conceptos relacionados con la implementación a imagen, mientras que los términos "automático" y "dinámico" son más generales.


Técnicamente hablando, la asignación de pila / pila son detalles de implementación, mientras que el almacenamiento automático / dinámico son los términos más generales. El estándar en sí mismo no exige que el asignador tenga que usar una pila / montón. Por lo tanto, automático / dinámico es el término más apropiado, aunque personalmente me parece que esa distinción es un poco demasiado pedante.


Automático me dice algo acerca de la vida útil de un objeto: específicamente, está vinculado automáticamente al ámbito que lo encierra, y se destruirá automáticamente cuando salga ese ámbito.

Dynamic me dice que el compilador no controla automáticamente la vida útil de un objeto, sino que está bajo mi control directo.

La pila es un nombre sobrecargado para un tipo de contenedor, y para el protocolo de puntero de instrucción popular relacionado admitido por las instrucciones comunes de call y ret . No me dice nada sobre la vida útil de un objeto, excepto a través de una asociación histórica con la vida útil de los objetos en C, debido a las populares convenciones de marcos de pila. Tenga en cuenta también que en algunas implementaciones, el almacenamiento local de subprocesos está en la pila de un subproceso, pero no está limitado al alcance de ninguna función individual.

Heap es nuevamente un nombre sobrecargado, que indica un tipo de contenedor ordenado o un sistema de administración de tienda libre. Esta no es la única tienda gratuita disponible en todos los sistemas, y tampoco me dice nada concreto sobre la vida útil de un objeto asignado con new .