Alocação de memória é assunto importante em C++. No entanto, nem todo mundo sabe exatamente como as coisas acontecem. Quantos de vocês já não viram códigos carregados de new/delete
em situações nas quais objetos de pilha seriam suficientes ou mais indicados?
O livro Exceptional C++ (Herb Sutter) tem vários tópicos sobre gerenciamento de memória. Inclusive, com uma tabelinha bem bacana que descreve as áreas de memória de um programa C++. O detalhe, talvez um pouco polêmico, é que é feita uma distinção entre o heap e o free store (espaço livre para armazenamento). Tentarei explicar.
Creio que todos sabem que a alocação dinâmica é mais cara que na pilha. Ou seja, o uso do new e delete implica em solicitação e devolução de memória ao sistema operacional durante execução do programa. A consequência disso é um preço, em termos de eficiência, maior do que aquele de um objeto criado por valor na pilha. Obviamente, o new é necessário em inúmeros casos. Mas de onde vem essa memória?
Provavelmente, alguns respoderam heap. Outros responderam free store. Há ainda os que dizem que ambos são exatamente a mesma coisa. Então, existe um veredito?
O padrão C++ não utiliza a palavra heap em nenhum momento com relação à memória. Esse termo só aparece no contexto da STL com a conotação da conhecida estrutura de dados. No que diz respeito a alocação dinâmica, está presente apenas o conceito de free store. É de lá que vem a memória dinâmica de um new
. Do ponto de vista prático, porém, o free store normalmente corresponde justamente ao que é chamado de heap nos sistemas. Portanto, apesar de certa confusão (ou mal entendido), considero que a forma oficial de se refereir a origem da memória obtida por new
seja através de free store. Mas também considero totalmente aceitável que o heap e o free store sejam, de fato, o mesmo lugar.
Uma das origens dessa confusão é que Herb Sutter menciona no livro que o free store é a área de memória dinâmica utilizada por new/delete
. Enquanto que o heap é área de memória utilizado pelas funções malloc/free
. Não tenho o padrão de C em minhas mãos, mas realmente gostaria de saber se ele utiliza a palavra heap com o significado de área de memória. Por acaso, alguém sabe?
De qualquer maneira, há uma mensagem bem esclarecedora na Intenet em que Bjarne Stroustrup tenta explicar por que foi feita a distinção entre heap e free store por Herb Sutter. De acordo com ele, a idéia era simplesmente deixar claro que uma alocação feita por malloc
é diferente de uma alocação feita por new
, o que faz sentido total.
Uau… Depois de toda essa discussão deixo um breve resumo da tabela de Exceptional C++ que descreve as 5 áreas de memória de um programa C++. A tabela detalhada também pode ser encontrada em GotW.
const data – Armazena literais de strings e outros valores read-only conhecidos em tempo de compilação, os quais duram durante toda a execução do programa.
pilha – Área de variáveis automáticas.
free store – Memória dinâmica alocada/liberada por new/delete
.
heap – Memória dinâmica alocada/liberada por malloc/free
.
global/static – Armazena dados globais e estáticos, os quais são inicializados quando o programa começa a executar.
Bom, espero ter sido útil.
Leandro T. C. Melo