Por que os termos “automático” e “dynamic” são preferidos aos termos “pilha” e “heap” no gerenciamento de memory C ++?

Relacionado a muitas perguntas e respostas sobre o SO, aprendi que é melhor se referir a objects cujo tempo de vida é gerenciado como residindo no armazenamento automático em vez da pilha.

Além disso, os objects alocados dinamicamente não devem ser referidos como residentes no heap, mas no armazenamento dynamic.

Eu entendo que há armazenamento automático, dynamic e estático, mas nunca entendi a diferença entre o stack automático e o heap dynamic. Por que o primeiro é preferido?

Não estou perguntando o que significa pilha / pilha ou como funciona o gerenciamento de memory. Eu estou perguntando por que os termos armazenamento automático / dynamic são preferidos sobre os termos pilha / pilha.

    Automático me diz algo sobre o tempo de vida de um object: especificamente que ele é vinculado automaticamente ao escopo de inclusão e será destruído automaticamente quando esse escopo é encerrado.

    Dinâmico me diz que o tempo de vida de um object não é controlado automaticamente pelo compilador, mas está sob meu controle direto.

    Stack é um nome sobrecarregado para um tipo de contêiner, e para o protocolo de pointers de instruções popular relacionado suportado por instruções comuns de call e ret . Ele não me diz nada sobre o tempo de vida de um object, exceto através de uma associação histórica a vidas úteis de objects em C, devido a convenções de frameworks de pilha populares. Observe também que, em algumas implementações, o armazenamento local de encadeamentos está na pilha de um encadeamento, mas não está limitado ao escopo de nenhuma function única.

    Heap é novamente um nome sobrecarregado, indicando um tipo de contêiner classificado ou um sistema de gerenciamento de armazenamento gratuito. Esta não é a única loja livre disponível em todos os sistemas, nem me diz nada concreto sobre o tempo de vida de um object alocado com o new .

    A maioria das implementações usa uma pilha para fazer backup de objects com armazenamento automático. Isso não é exigido pelo padrão, mas funciona bem na maioria das arquiteturas de CPU atualmente.

    As implementações usam várias estratégias para retroceder objects com duração de armazenamento dynamic. Não tenho certeza se um heap é a melhor maneira de descrever o que os alocadores de memory modernos usam, mas esse parece ser o termo “histórico” para isso.

    Armazenamento automático / dynamic são termos usados ​​pelo padrão para classificar (“abstrato”) a vida útil do object. Esses são os termos apropriados para usar se você quiser falar objects conforme o padrão os descreve.
    Pilhas e pilhas são técnicas de implementação (“concretas”) que podem ser usadas para apoiá-las. Usar esses termos é menos correto, a menos que você esteja falando sobre uma implementação específica.

    Os termos de armazenamento automático / dynamic são preferíveis, simplesmente porque é isso que a norma exige. Stack / heap são baseados em implementação e teoricamente podem ser implementados de outra forma.

    Tecnicamente falando, alocação de pilha / heap são detalhes de implementação, enquanto armazenamento automático / dynamic são os termos mais gerais. O padrão em si não exige que o alocador use uma pilha / heap. Portanto, automático / dynamic é o termo mais apropriado, embora pessoalmente eu ache essa distinção um pouco excessivamente pedante.

    Os termos “duração do armazenamento estático”, “duração do armazenamento automático” e “duração do armazenamento dynamic” aparecem no padrão C ++.

    Os termos “pilha” e “pilha” são usados ​​para se referir a resources da Biblioteca Padrão ( stack<> , make_heap() , push_heap() , etc.) que têm pouco a ver com a duração do armazenamento.

    Pilha e heap trazem conceitos relacionados à implementação em imagens, enquanto os termos “automático” e “dynamic” são mais gerais