C ++, loja grátis vs pilha

Alocações dinâmicas com new/delete são ditas como ocorrendo no free-store ,
enquanto operações malloc/free usam o heap .

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

Veja http://www.gotw.ca/gotw/009.htm ; ele pode descrever as diferenças entre o heap e o free-store muito melhor do que eu poderia:

Free-store:

O armazenamento gratuito é uma das duas áreas de memory dinâmica, alocada / liberada por new / delete. O tempo de vida do object pode ser menor que o tempo em que o armazenamento é alocado; ou seja, objects de armazenamento livre podem ter memory alocada sem serem inicializados imediatamente e podem ser destruídos sem que a memory seja imediatamente desalocada. Durante o período em que o armazenamento é alocado, mas fora do tempo de vida do object, o armazenamento pode ser acessado e manipulado por meio de um void *, mas nenhum dos membros não estáticos ou funções membro do proto-object pode ser acessado, ter seus endereços tirados ou manipulado .

Heap:

O heap é a outra área de memory dinâmica, alocada / liberada por malloc / free e suas variantes. Observe que, embora o padrão global new e delete possa ser implementado em termos de malloc e liberado por um compilador específico, o heap não é o mesmo que o armazenamento gratuito e a memory alocada em uma área não pode ser desalocada com segurança no outro. A memory alocada do heap pode ser usada para objects do tipo de class por posicionamento – nova construção e destruição explícita. Se assim for utilizado, as notas sobre a vida útil do object de armazenamento gratuito se aplicam da mesma forma aqui.

Para C ++, a diferença entre o armazenamento livre e o heap tornou-se puramente conceitual. Como um pote para colecionar insetos e outro para coletar biscoitos. Um é rotulado de um jeito, o outro outro. Esta designação destina-se a direcionar para casa o ponto de você NUNCA misturar “novo” e “excluir” com “malloc”, “realloc” ou “livre” (ou conjuntos de nível de bits para esse assunto).

Durante as entrevistas é bom dizer que “new e delete usam o free store, malloc e free usam o heap; new e delete chamam o construtor e o destructor, respectivamente, porém malloc e free não.” No entanto, muitas vezes você ouvirá que os segmentos de memory estão realmente na mesma área – no entanto, isso PODE ser específico do compilador, ou seja, é possível que ambos possam designar diferentes espaços de memory como conjuntos (não sei por que isso seria, Apesar).

A resposta de Mike Koval cobre a teoria muito bem. Na prática, no entanto, eles são quase sempre a mesma região de memory – na maioria dos casos, se você pesquisar a new implementação do compilador, você verá que ela chama 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 ++ nós dissemos “heap” para significar o que agora é chamado de “free store”.

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

Heap e free-store não devem ser interoperáveis. Em contextos restritos como nos micro controladores AVR de 8 bits com c ++ 11 Standard Library, eles não podem ser usados ​​no mesmo programa. Armazenamento e heap livres fazem suas alocações no mesmo espaço de memory, sobrescrevendo cada outras estruturas e dados. Nesse contexto, Free Store é diferente e incompatível com Heap porque a “nova / excluir 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 memory para o Programador embutido em C ++ (em um contexto onde você tem apenas 512 bytes de RAM).

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

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

Free Store é um pool de memory heap não alocada dado a um programa que é usado pelo programa para alocação dinâmica durante a execução do programa. Cada programa é fornecido com um conjunto de memory heap não alocado que ele pode utilizar durante a execução. Esse pool de memory disponível é chamado de armazenamento gratuito do programa. A memory de armazenamento livre alocada é sem nome.