Entendendo ponteiros e a heap (free store)

Elemar Júnior

No post anterior, vimos o que é e para que serve a stack (e o que causa a StackOverflowException). Nesse post, vamos tratar de outros dois conceitos fundamentais: ponteiros e a heap.

O que são ponteiros

Ponteiros são variáveis que armazenam endereços de memória. Eles foram introduzidos, em linguagens de alto padrão, na antiga PL/I com o propósito de permitir a construção de listas (listas encadeadas, para ser mais preciso).

O tamanho de um ponteiro está associado a quantidade de bytes necessários para representar um endereço de memória. Modernamente, eles geralmente são de 32 bits ou 64 bits.

Ponteiros são pequenos o suficiente para ficarem armazenados em registradores da CPU, ou mesmo em variáveis locais, na stack.

Ponteiros possuem uma aritmética própria. A ideia é permitir o acesso a posições de memória adjacentes através de operações de adição e subtração.

O código abaixo utiliza ponteiros e aritimética de ponteiros:

public static unsafe string UnsafeReverseString(string input)
{
    var result = new string(' ', input.Length);
    fixed (char* source = input)
    fixed (char* dest = result)
    {
        for (
            int i = input.Length - 1, destIndex = 0;
            i >= 0;
            i--, destIndex++
        )
        {
            dest[destIndex] = source[i];
        }
    }
    return result;
}

Em C# (e Java), ponteiros não estão, explicitamente, disponíveis por padrão. Sua utilização fica restrita a códigos marcados como unsafe.

O que é a Heap (ou free store)

O heap é a área de memória onde ficam os objetos que alocamos dinamicamente em nossos programas. Ou seja, objetos com localização e tamanho variável e/ou não previstos durante processo de compilação.

Enquanto a Stack é uma estrutura organizada, o Heap (não confundir com a estrutura de dados) pode ser uma “bagunça” (não é o caso de .NET).

Como a localização de objetos na heap é variável, o acesso geralmente acontece através de um ponteiro (implicitamente, em .NET).

Quando um objeto é criado na heap, dizemos que estamos alocando memória. Quando um objeto é removido da heap, dizemos que estamos desalocando memória.

Em C++, o programador determina o momento da alocação e desalocação de objetos. Em C#, o programador determina apenas o momento da alocação, ficando a desalocação sob responsabilidade do Garbage Collector (a menos que se esteja utilizando um heap não-gerenciado).

O Garbage Collector é o artefato de software responsável por fazer a desalocação de objetos na heap, em .NET. Falaremos mais sobre ele em posts futuros.

Comparando a heap e a stack

Em nossos programas utilizamos invariavelmente a stack ou uma heap (geralmente gerenciada – tema para outro post).

Todos os valores que estão alocados na stack são automaticamente desalocados quando seu stack frame é removido (saída de contexto). Os objetos alocados na heap são desalocados de forma não-determinística, pelo GC, ou de forma determinística e não automática caso utilizemos heaps não-gerenciados.

Os objetos alocados na stack só podem ser utilizados na thread em que o método/função foi acionado. Os objetos alocados na heap podem ser acionados por qualquer código com um ponteiro para sua posição na memória.

O acesso de objetos na stack é mais rápido.

O volume de dados que pode ser armazenado na stack é limitado (cuidado com Stackoverflow!). O volume de dados alocados na heap está associado a quantidade de memória disponível, incluindo armazenamento temporário em disco.

Fechando … por enquanto

A heap é fundamental para nossos sistemas. Entretanto, em nossos clientes, a gestão ruim da heap é a terceira causa mais frequente de performance pobre.

Em posts futuros iremos falar mais sobre como a gestão da heap ocorre em .NET e em outras tecnologias.

Compartilhe este insight:

Comentários

Participe deixando seu comentário sobre este artigo a seguir:

Subscribe
Notify of
guest
1 Comentário
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Eduardo Spaki
Eduardo Spaki
3 anos atrás

No .NET, quando há passagem por referencia de tipos primitivos (no c# marcados com ref ou até mesmo out), como que funcionaria esse processo de controle dessas variáveis?

AUTOR

Elemar Júnior
Fundador e CEO da EximiaCo atua como tech trusted advisor ajudando empresas e profissionais a gerar mais resultados através da tecnologia.

NOVOS HORIZONTES PARA O SEU NEGÓCIO

Nosso time está preparado para superar junto com você grandes desafios tecnológicos.

Entre em contato e vamos juntos utilizar a tecnologia do jeito certo para gerar mais resultados.

Insights EximiaCo

Confira os conteúdos de negócios e tecnologia desenvolvidos pelos nossos consultores:

Engenharia de Software

Três vantagens reais de utilizar orquestradores BPM para serviços

Arquiteto de software e solução com larga experiência corporativa
Desenvolvimento de Software

Os principais desafios ao adotar testes

Especialista em Testes e Arquitetura de Software
Arquitetura de Dados

Insights de um DBA na análise de um plano de execução

Especialista em performance de Bancos de Dados de larga escala

Acesse nossos canais

Simplificamos, potencializamos e aceleramos resultados usando a tecnologia do jeito certo

EximiaCo 2022 – Todos os direitos reservados

1
0
Queremos saber a sua opinião, deixe seu comentáriox
()
x

Entendendo ponteiros e a heap (free store)

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Condição especial de pré-venda: R$ 14.000,00 - contratando a mentoria até até 31/01/2023 e R$ 15.000,00 - contratando a mentoria a partir de 01/02/2023, em até 12x com taxas.

Tenho interesse nessa capacitação

Para solicitar mais informações sobre essa capacitação para a sua empresa, preencha o formulário a seguir:

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

O seu insight foi excluído com sucesso!

O seu insight foi excluído e não está mais disponível.

O seu insight foi salvo com sucesso!

Ele está na fila de espera, aguardando ser revisado para ter sua publicação programada.

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse nessa solução

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse neste serviço

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

× Precisa de ajuda?