Feeds:
Posts
Comentários

Archive for maio \24\-03:00 2009

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

Read Full Post »

Este post é um pouco diferente. Ao invés de escrever sobre o assunto aqui, simplesmente encaminho o link para um artigo no CodeProject. O texto relata os meus passos e aprendizado na implementação do teste de unicidade de URLs (URL-seen test) em um web crawler. Especificamente, o foco é na técnica conhecida como DRUM (Disk Repository with Update Management), utilizada para armazenamento de pares chave/valor e verificações assíncronas. Se você tem interesse no tópico e não está com muita preguiça (ou muito trabalho) neste momento, boa leitura! Ah… é claro. Sugestões são sempre bem-vindas.

Leandro T. C. Melo

Read Full Post »