Associando uma variável a um espaço de memória
Tempo de Vida de uma variável (período do vínculo)
Tipos
- Estática
- Dinâmica
- Pilha (stack)
- Monte (heap)
- Explícitas
- Implícitas
Vinculação é feita antes do tempo de execução (segmento de dados)
Se mantém do início ao fim, e não muda
\pause Vantanges
- Endereçamento direto, Alocação única
- \pause Subprogramas sensíveis ao histórico
int conta () { static int meu_contador = 0; meu_contador += 1; return meu_contador; }
\pause Desvantagens
- Falta de flexibilidade (se houver somente estática)
- Recursão é impossível
- Compartilhamento
Globais, Locais com static
,
atributos estáticos de classe
gcc -c exemplo1.c
nm exemplo1.o
Notem as duas variáveis x1
em BSS
Notem que y
é um símbolo comum
Vinculação é feita em tempo de execução na pilha
(variáveis automáticas)
\pause
int fib (n) {
int n1 = n - 1;
int n2 = n - 2;
switch (n){
case 0: return 1;
case 1: return 1;
default: return fib(n1) + fib(n2);
}
}
\pause Cada instância de fib
tem um frame na pilha
n1
en2
são alocados nela- Vínculo existe durante a execução de
fib(n)
Quando retorna, o frame é desalocado, vínculo desfeito
Vantagens
- Flexibilidade (recursão já é possível)
- Segurança
Desvantagens
- Endereçamento relativo, mas calculado em tempo de compilação.
- Alocação a cada execução do bloco
static
)
gcc -g -O0 -rdynamic exemplo1.c
Observar registros de ativação
gdb ./a.out
# (info frame)
Vinculação é feita em tempo de execução no monte
Explícita (programador)
int *p = malloc (sizeof(int));
*p = 3;
free(p);
PajeSimulator *simulator = [[PajeSimulator alloc] init];
[simulator release];
QBoxLayout *topLayout = new QBoxLayout ();
delete topLayout;
Implícita (linguagem)
highs = [20, 23, 18, 15, 30];
Referências e Ponteiros
$ gcc -g -O0 -rdynamic exemplo3.c
$ valgrind ./a.out
Quando Implícitas (custo escondido)
- Vetores dinâmicos em Algol
- Linguagens de script interpretadas
- Linguagens Funcionais e Lógicas
- Estática
- Dinâmica
- Pilha
- Monte
- Explícitas
- Implícitas