ti-enxame.com

Diferença entre alocação de memória estática e alocação de memória dinâmica

Gostaria de saber qual é a diferença entre alocação de memória estática e alocação de memória dinâmica?

Você poderia explicar isso com algum exemplo?

67
Nishant Kumar

Existem três tipos de alocação - estática, automática e dinâmica.

Alocação estática significa que a memória para suas variáveis ​​é alocada quando o programa é iniciado. O tamanho é fixo quando o programa é criado. Aplica-se a variáveis ​​globais, variáveis ​​de escopo de arquivo e variáveis ​​qualificadas com static definidas dentro de funções.

Alocação de memória automática ocorre para variáveis ​​(não estáticas) definidas dentro de funções, e é normalmente armazenada em stack (embora o padrão C não determine que uma pilha seja usada). Você não precisa reservar memória extra usando-os, mas, por outro lado, também tem controle limitado sobre a vida útil dessa memória. Por exemplo: as variáveis ​​automáticas em uma função estão lá apenas até a conclusão da função.

void func() {
    int i; /* `i` only exists during `func` */
}

Alocação de memória dinâmica é um pouco diferente. Agora você controla o tamanho exato e a vida útil desses locais de memória. Se você não liberá-lo, você encontrará vazamentos de memória, o que pode causar falha no aplicativo, já que, em algum momento, o sistema não pode alocar mais memória.

int* func() {
    int* mem = malloc(1024);
    return mem;
}

int* mem = func(); /* still accessible */

No exemplo acima, a memória alocada ainda é válida e acessível, mesmo que a função seja finalizada. Quando você terminar com a memória, você tem que liberá-lo:

free(mem);
68
Constantinius

Esta é uma questão de entrevista padrão:

Alocação de memória dinâmica

A memória é alocada em tempo de execução usando calloc(), malloc() e amigos. Às vezes, também é chamado de memória 'heap', embora não tenha nada a ver com a estrutura de dados do heap  ref .

int * a = malloc(sizeof(int));

A memória heap é persistente até que free() seja chamado. Em outras palavras, você controla o tempo de vida da variável.

Alocação automática de memória

Isso é o que é comumente conhecido como memória 'stack' e é alocado quando você insere um novo escopo (geralmente quando uma nova função é pressionada na pilha de chamadas). Quando você sai do escopo, os valores dos endereços de memória automáticos são indefinidos e é um erro para acessá-los

int a = 43;

Observe que o escopo não significa necessariamente função. Os escopos podem aninhar dentro de uma função, e a variável estará dentro do escopo somente dentro do bloco em que foi declarada. Note também que onde esta memória é alocada não é especificada. (Em um sistema sane ele estará na pilha, ou registra para otimização)

Alocação de memória estática

É alocado em tempo de compilação e o tempo de vida de uma variável na memória estática é a duração do programa

Em C, a memória estática pode ser alocada usando a palavra-chave static. O escopo é apenas a unidade de compilação. 

As coisas ficam mais interessantes quando a palavra-chave extern é considerada . Quando uma variável extern é definida o compilador aloca memória para ela. Quando uma variável extern é declarada, o compilador requer que a variável seja definida em outro lugar. Deixar de declarar/definir variáveis ​​extern causará problemas de vinculação, enquanto a falha em declarar/definir variáveis ​​static causará problemas de compilação.

no escopo do arquivo, a palavra-chave estática é opcional (fora de uma função):

int a = 32;

Mas não no escopo da função (dentro de uma função):

static int a = 32;

Tecnicamente, extern e static são duas classes separadas de variáveis ​​em C.

extern int a; /* Declaration */
int a; /* Definition */

Registrar a memória

A última classe de memória são as variáveis ​​'register'. Como esperado, as variáveis ​​de registro devem ser alocadas no registro de uma CPU, mas a decisão é deixada para o compilador. Você não pode transformar uma variável de registro em uma referência usando o endereço-de. 

register int meaning = 42;
printf("%p\n",&meaning); /* this is wrong and will fail at compile time. */

A maioria dos compiladores modernos são mais inteligentes do que você ao escolher quais variáveis ​​devem ser colocadas nos registradores :)

Referências:

Notas sobre alocação de memória estática

É um pouco confuso dizer que a memória estática é alocada em tempo de compilação, especialmente se começarmos a considerar que a máquina de compilação e a máquina Host podem não ser as mesmas ou podem nem estar na mesma arquitetura. 

Pode ser melhor pensar que a alocação de memória estática é tratada pelo compilador em vez de alocado em tempo de compilação. Por exemplo, o compilador pode criar uma grande seção data no binário compilado e quando o programa é carregado na memória, o endereço dentro do segmento data do programa será usado como o local da memória alocada. Isto tem a acentuada desvantagem de tornar o binário compilado muito grande se usar muita memória estática. É possível escrever um binário de vários gigabytes gerado a partir de menos de meia dúzia de linhas de código. Outra opção é o compilador injetar o código de inicialização que irá alocar memória de alguma outra forma antes que o programa seja executado. Este código irá variar de acordo com a plataforma de destino e o sistema operacional. Na prática, os compiladores modernos usam heurísticas para decidir quais dessas opções usar. Você mesmo pode tentar fazer isso escrevendo um pequeno programa em C que aloca uma grande matriz estática de itens de 10k, 1m, 10m, 100m, 1G ou 10G. Para muitos compiladores, o tamanho binário continuará crescendo linearmente com o tamanho do array e, além de um certo ponto, ele encolherá novamente à medida que o compilador usar outra estratégia de alocação.

92
brice

alocação de memória dinâmica - memória é alocada durante o tempo de execução na pilha. Isso é usado quando a quantidade (tamanho) de memória é variável e é conhecida apenas durante o tempo de execução. A alocação dinâmica é obtida usando certas funções como malloc (), calloc (), realloc (), livre em C e "new", "delete" em C++.

Alocação de memória estática - memória alocada em tempo de compilação em pilha ou outros segmentos de dados. Isso é usado quando a quantidade (tamanho) da memória é estática/constante e é conhecida durante o tempo de compilação.

3
vinay

Alocação de memória estática: O compilador aloca o espaço de memória necessário para uma variável declarada.Usando o endereço do operador, o endereço reservado é obtido e este endereço pode ser atribuído a uma variável de ponteiro.Uma vez que a variável declarada tem memória estática, essa maneira de atribuir valor de ponteiro a uma variável de ponteiro é conhecida como alocação de memória estática. memória é atribuída durante o tempo de compilação.

alocação de memória dinâmica: Ele usa funções como malloc () ou calloc () para obter memória dinamicamente.Se essas funções são usadas para obter memória dinamicamente e os valores retornados por essas funções são atribuídas a variáveis ​​de ponteiro, tais atribuições são conhecido como dynamic memory allocation.memory é definido durante o tempo de execução.

2
Rajeev Kumar

Diferença entre ALOCAÇÃO DE MEMÓRIA ESTÁTICA & ALOCAÇÃO DE MEMÓRIA DINÂMICA  

A memória é alocada antes do início da execução do programa (Durante a compilação).
A memória é alocada durante a execução do programa. 

Nenhuma ação de alocação ou desalocação de memória é executada durante a execução.
As ligações de memória são estabelecidas e destruídas durante a execução. 

Variáveis ​​permanecem permanentemente alocadas.
Alocado somente quando a unidade de programa está ativa. 

Implementado usando pilhas e pilhas.
Implementado usando segmentos de dados. 

Ponteiro é necessário para acessar variáveis.
Não há necessidade de ponteiros alocados dinamicamente. 

Execução mais rápida que dinâmica.
Execução mais lenta que estática. 

Mais espaço de memória necessário.
Menos espaço de memória necessário. 

1
Ebenezer

Alocação de memória estática é alocada memória antes da execução do programa pf durante o tempo de compilação. Alocação de memória dinâmica é alocada memória durante a execução do programa em tempo de execução.

0
Ritu maheswari

Alocação de memória estática. Memória alocada será na pilha.

int a[10];

Alocação de memória dinâmica. Memória alocada será no heap.

int *a = malloc(sizeof(int) * 10);

e o último deve ser free d, pois não há Coletor de Lixo (GC) em C.

free(a);
0
onemach