C ++, loja livre versus pilha

124

new/deleteDizem que as alocações dinâmicas ocorrem no free-store ,
enquanto as malloc/freeoperações usam o heap .

Eu gostaria de saber se existe uma diferença real, na prática.
Os compiladores fazem uma distinção entre os dois termos? ( Loja gratuita e Heap , não new/malloc)

Nick Dandoulakis
fonte

Respostas:

76

Veja http://www.gotw.ca/gotw/009.htm ; ele pode descrever as diferenças entre a pilha e a loja gratuita muito melhor do que eu poderia:

Loja gratuita:

O armazenamento gratuito é uma das duas áreas de memória dinâmica, alocada / liberada por nova / exclusão. A vida útil do objeto pode ser menor que o tempo em que o armazenamento é alocado; isto é, os objetos de armazenamento livre podem ter memória alocada sem serem inicializados imediatamente e podem ser destruídos sem que a memória seja desalocada imediatamente. Durante o período em que o armazenamento é alocado, mas fora do tempo de vida do objeto, o armazenamento pode ser acessado e manipulado através de um vazio *, mas nenhum dos membros não estáticos do proto-objeto ou funções de membro podem ser acessados, ter seus endereços tirados ou manipulados .

Montão:

O heap é a outra área de memória dinâmica, alocada / liberada pelo malloc / free e suas variantes. Observe que, embora o novo global e exclusão padrão possam ser implementados em termos de malloc e free por um compilador específico, o heap não é o mesmo que armazenamento livre e a memória alocada em uma área não pode ser desalocada com segurança na outra. A memória alocada do heap pode ser usada para objetos do tipo de classe colocando construção nova e destruição explícita. Se usado, as notas sobre a vida útil do objeto de armazenamento gratuito aplicam-se da mesma forma aqui.

Michael Koval
fonte
23
Discordo. A palavra "heap" no contexto de alocação dinâmica não é usada nem pelo padrão C ++ nem pelo C99 (não tenho o C89 ao qual o C ++ se refere, fique à vontade para me corrigir se usar a palavra). Não consegui encontrar a data em que o GotW em questão foi publicado, mas como ele fala sobre o rascunho, é obviamente pré-padrão.
avakar
2
Esta é toda a questão da terminologia, imho. Diga, sr. Stroustrup não distingue 'heap' e 'free store': stroustrup.com/Programming/17_free_store.ppt , slide 12. 'Heap' foi usado como sinônimo de memória dinâmica muito tempo antes de C ++, desde o tempo de Lisp (década de 1960), que usava estrutura de dados de heap para alocação de memória.
Alexey Voytenko
Geralmente penso na pilha (via maloc / free) como uma espécie de fornecedor de matéria-prima. Você pede um pedaço de memória e não adere a isso. Você precisa construir quaisquer estruturas. O Free Store (novo / excluir) é mais como um fornecedor de 'produtos acabados'. Você pede um objeto e ele recebe um pouco de espaço e o objeto que ele construiu e preparou para seu uso. Quando termina, fica bem limpo.
Anshuman Kumar
67

Para C ++, a diferença entre o armazenamento gratuito e o heap tornou-se puramente conceitual. Como uma jarra para coletar bugs e outra para coletar cookies. Um é rotulado de um jeito, o outro de outro. Essa designação deve levar em consideração o ponto em que você NUNCA mistura " new" e " delete" com " malloc", " realloc" ou "free " (ou nível de bits definido para esse assunto).

Durante as entrevistas, é bom dizer que " newe deleteuse o armazenamento gratuito malloce freeuse a pilha; newe deletechame o construtor e o destruidor, respectivamente, no entanto malloce freenão." No entanto, muitas vezes você ouvirá que os segmentos de memória estão realmente na mesma área - no entanto, que PODEM ser específicos do compilador, ou seja, é possível que ambos possam designar diferentes espaços de memória como conjuntos (sem saber por que, Apesar).

Kit10
fonte
28

A resposta de Mike Koval cobre muito bem a teoria. Na prática, no entanto, eles são quase sempre a mesma região de memória - na maioria dos casos, se você pesquisar na implementação do compilador new, encontrará as chamadas malloc().

Em outras palavras: do ponto de vista da máquina, heap e free store são a mesma coisa. A distinção existe dentro do compilador.

Para tornar as coisas ainda mais confusas, antes do advento do C ++, dissemos "heap" para significar o que agora é chamado de "armazenamento gratuito".

Crashworks
fonte
5

O termo "heap" também pode se referir a uma estrutura de dados específica, mas, no contexto das operações malloc C ++, free, new e delete, os termos "heap" e "free store" são usados ​​mais ou menos de forma intercambiável.

Jim Lewis
fonte
3

Heap e free-store não devem ser interoperáveis. Em contextos restritos, como nos microcontroladores AVR de 8 bits com a biblioteca padrão c ++ 11, eles nem sequer podem ser usados ​​no mesmo programa. Armazenamento livre e heap fazem suas alocações no mesmo espaço de memória, substituindo as estruturas e os dados. Nesse contexto, o armazenamento gratuito é diferente e incompatível com o Heap porque a "nova / exclui biblioteca de armazenamento livre" é mais simples (e mais rápida) que a "biblioteca de heap Malloc / free / realloc / calloc" e, portanto, fornece enormes ganhos de uso de memória para o Heap. Programador incorporado C ++ (em um contexto em que você possui apenas 512 bytes de RAM).

Consulte a Biblioteca padrão c ++ 11/14 de 8 bits em https://github.com/ambroise-leclerc/ETL/tree/master/libstd

Ambroise Leclerc
fonte
2

Não me lembro do padrão que mencionou a palavra heap, exceto nas descrições de funções de heap como push_heapet al. Todas as alocações dinâmicas são realizadas no free-store.

avakar
fonte
1

O Free Store é um conjunto de memória heap não alocada fornecida a um programa usado pelo programa para alocação dinâmica durante a execução do programa. Cada programa é fornecido com um conjunto de memória heap não alocada que ele pode utilizar durante a execução. Esse pool de memória disponível é conhecido como armazenamento gratuito do programa. A memória de armazenamento livre alocada não tem nome.

Sudipto
fonte