¿Por qué los términos “automático” y “dynamic” se prefieren a los términos “stack” y “montón” en la gestión de memoria C ++?

En relación con muchas preguntas y respuestas sobre SO, aprendí que es mejor hacer referencia a los objetos cuya vida útil se gestiona como residir en el almacenamiento automático en lugar de la stack.

Además, no se debe hacer referencia a que los objetos asignados dinámicamente residan en el montón, sino en el almacenamiento dynamic.

Entiendo que hay almacenamiento automático, dynamic y estático, pero nunca entendí realmente la diferencia entre stack automática y dynamic-heap. ¿Por qué el primero es preferido?

No estoy preguntando qué significa stack / heap o cómo funciona la gestión de memoria. Me pregunto por qué los términos almacenamiento automático / dynamic son preferibles a los términos stack / montón.

Automático me dice algo acerca de la duración de un objeto: específicamente que está vinculado automáticamente al ámbito adjunto y se destruirá automáticamente cuando salga ese scope.

Dynamic me dice que el comstackdor no controla automáticamente la duración de un objeto, sino que está bajo mi control directo.

Stack es un nombre sobrecargado para un tipo de contenedor, y para el protocolo de puntero de instrucción popular relacionado soportado por instrucciones comunes de call y ret . No me dice nada acerca de la vida útil de un objeto, excepto a través de una asociación histórica para objetar vidas en C, debido a las convenciones populares de cuadros de stack. Tenga en cuenta también que, en algunas implementaciones, el almacenamiento local de subprocesos se encuentra en la stack de un subproceso, pero no está limitado al scope de una sola función.

Heap es nuevamente un nombre sobrecargado, que indica un tipo de contenedor clasificado 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 .

La mayoría de las implementaciones usan una stack para respaldar objetos con almacenamiento automático. Esto no es requerido por el estándar, pero funciona bien en la mayoría de las architectures de CPU actualmente.

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

Por lo tanto, el almacenamiento automático / dynamic son términos que el estándar usa para clasificar los tiempos de vida de los objetos (“abstractos”). Esos son los términos adecuados para usar si desea hablar de objetos como lo describe el estándar.
Las stacks y stacks son técnicas de implementación (“concretas”) que se pueden usar para respaldarlas. Usar esos términos es menos correcto, a menos que esté hablando de una implementación específica.

Los términos de almacenamiento automático / dynamic son preferibles simplemente porque esto es lo que exige el estándar. Stack / Heap se basa en la implementación y teóricamente se puede implementar de otra manera.

Técnicamente, la asignación de stack / heap son detalles de implementación, mientras que el almacenamiento automático / dynamic son los términos más generales. El estándar en sí no exige que el asignador tenga que usar un stack / heap. Por lo tanto, automático / dynamic es el término más apropiado, aunque personalmente encuentro que esa distinción es demasiado pedante.

Los términos “duración de almacenamiento estático”, “duración de almacenamiento automático” y “duración de almacenamiento dynamic” aparecen en el estándar de C ++.

Los términos “stack” y “montón” se utilizan para referirse a las características en la Biblioteca estándar ( stack<> , make_heap() , push_heap() , etc.) que tienen poco que ver con la duración del almacenamiento.

La stack y el montón aportan conceptos relacionados con la implementación a la imagen, mientras que los términos “automático” y “dynamic” son más generales.