Isto consome memória?
Pessoal,
Quando no programa faço uma associação de variável do tipo:
está ocorrendo consumo relevante de memória? Ou o consumo de memória só ocorre efetivamente quando instancio o objeto?
Quando no programa faço uma associação de variável do tipo:
var editValor : TEdit;
está ocorrendo consumo relevante de memória? Ou o consumo de memória só ocorre efetivamente quando instancio o objeto?
editValor := TEdit.Create(nil);
_flavio_
Curtidas 0
Respostas
Discorpio
14/10/2008
Boa noite _Flavio_
Tudo vai depender onde voce declara as variáveis.
Como Assim :?:
Quando você declara uma variável e seu tipo, na verdade você está reservando na memória uma espaço para ela receber uma valor, exatamente o tipo de valor que você a declara, porém ela se encontra vazia, até você atribuir o valor do tipo exato que você declarou a ela. Esta reserva de memória acontece no exato momento dependendo onde você a declara dentro da Unidade (Unit).
Vamos aos exemplos:
[color=blue:49ecfaf9cb]Variáveis Globais:[/color:49ecfaf9cb] Estas são reservadas na memória no momento em que se inicializa o seu sistema, e são declaradas antes da palavra reservada [color=blue:49ecfaf9cb]´implementation´[/color:49ecfaf9cb], assim:
[color=blue:49ecfaf9cb]Variáveis Locais:[/color:49ecfaf9cb] Estas são declaradas dentro do escopo dos métodos (Procedures e Functions), entre o escopo do método e a palavra reservada [color=blue:49ecfaf9cb]´begin´[/color:49ecfaf9cb], e são reservadas na memória somente quando o método é invocado, e são automaticamente liberadas da memória, quando o método sai de escopo, ou seja, termina de executar a rotina. exemplo:
[color=blue:49ecfaf9cb]Variáveis declaradas dentro das Classes:[/color:49ecfaf9cb] Estas são reservadas na memória quando os Objetos de suas classes são instanciados ou quando se faz referência a sua classe e Unit, isto é também depende em que seção dentro da classe você a declara, como Private, Public, Protected ou Published.
[color=blue:49ecfaf9cb]Variáveis do tipo Objeto:[/color:49ecfaf9cb] Todo objeto precisa de uma classe para definir o seu tipo, o seja, quando voce declara e implementa uma classe, voce não reserva espaço em memória, isto porque voce está apenas definindo o tipo de dado, o qual poderá ser declarado em varias variáveis, estas variáveis que são declaradas como sendo do tipo de uma classe previamente definidas, são consideradas instâncias do Objeto, ou seja, quando voce declara uma variável do tipo de uma classe, na verdade voce está alocando espaço para receber aquele tipo de Objeto, em outras palavras, as variáveis do tipo Objeto obedecem as mesmas regras para as variáveis do tipo primitivo descritas acima.
Na Instanciação do Objeto, ou seja, na criação do Objeto, ai sim que Objeto vai ser alocado na memória, porém não diretamente na variável declarada. Como assim :?: As variáveis ou instâncias de Objeto, tem um comportamento diferente. Muita gente pensa que quando voce declara uma variável do tipo Objeto, pensam que o Objeto em si é armazenado naquela variável declarada, quando na verdade o que é reservada nela, é apenas uma referência do endereço de memória onde o Objeto declarado foi criado (Instanciado), ou seja, a variável funciona como se fosse um [color=blue:49ecfaf9cb]ponteiro do Objeto[/color:49ecfaf9cb].
Tudo vai depender onde voce declara as variáveis.
Como Assim :?:
Quando você declara uma variável e seu tipo, na verdade você está reservando na memória uma espaço para ela receber uma valor, exatamente o tipo de valor que você a declara, porém ela se encontra vazia, até você atribuir o valor do tipo exato que você declarou a ela. Esta reserva de memória acontece no exato momento dependendo onde você a declara dentro da Unidade (Unit).
Vamos aos exemplos:
[color=blue:49ecfaf9cb]Variáveis Globais:[/color:49ecfaf9cb] Estas são reservadas na memória no momento em que se inicializa o seu sistema, e são declaradas antes da palavra reservada [color=blue:49ecfaf9cb]´implementation´[/color:49ecfaf9cb], assim:
nit Unit3;
interface
{ O que for declarado aqui, entre interface e implementation
são considerados Globais }
implementation
end.
[color=blue:49ecfaf9cb]Variáveis Locais:[/color:49ecfaf9cb] Estas são declaradas dentro do escopo dos métodos (Procedures e Functions), entre o escopo do método e a palavra reservada [color=blue:49ecfaf9cb]´begin´[/color:49ecfaf9cb], e são reservadas na memória somente quando o método é invocado, e são automaticamente liberadas da memória, quando o método sai de escopo, ou seja, termina de executar a rotina. exemplo:
procedure TForm1.btnIncluirClick(Sender: TObject);
var Path: String // Aqui a variável é reservada na memória
begin
Path := "C:/Meu Projeto/....."; // Aqui é atribuído o seu valor
....
....
end;
{ Quando a procedure é finalizada a variável Path não pode ser]
utilizada, pois foi liberada da memória }
[color=blue:49ecfaf9cb]Variáveis declaradas dentro das Classes:[/color:49ecfaf9cb] Estas são reservadas na memória quando os Objetos de suas classes são instanciados ou quando se faz referência a sua classe e Unit, isto é também depende em que seção dentro da classe você a declara, como Private, Public, Protected ou Published.
[color=blue:49ecfaf9cb]Variáveis do tipo Objeto:[/color:49ecfaf9cb] Todo objeto precisa de uma classe para definir o seu tipo, o seja, quando voce declara e implementa uma classe, voce não reserva espaço em memória, isto porque voce está apenas definindo o tipo de dado, o qual poderá ser declarado em varias variáveis, estas variáveis que são declaradas como sendo do tipo de uma classe previamente definidas, são consideradas instâncias do Objeto, ou seja, quando voce declara uma variável do tipo de uma classe, na verdade voce está alocando espaço para receber aquele tipo de Objeto, em outras palavras, as variáveis do tipo Objeto obedecem as mesmas regras para as variáveis do tipo primitivo descritas acima.
Na Instanciação do Objeto, ou seja, na criação do Objeto, ai sim que Objeto vai ser alocado na memória, porém não diretamente na variável declarada. Como assim :?: As variáveis ou instâncias de Objeto, tem um comportamento diferente. Muita gente pensa que quando voce declara uma variável do tipo Objeto, pensam que o Objeto em si é armazenado naquela variável declarada, quando na verdade o que é reservada nela, é apenas uma referência do endereço de memória onde o Objeto declarado foi criado (Instanciado), ou seja, a variável funciona como se fosse um [color=blue:49ecfaf9cb]ponteiro do Objeto[/color:49ecfaf9cb].
GOSTEI 0
_flavio_
14/10/2008
Amigo, Discorpio
Agradeço a sua excelente resposta, me tirou diversas dúvidas.
Muito obrigado!
Agradeço a sua excelente resposta, me tirou diversas dúvidas.
Muito obrigado!
GOSTEI 0