var
Pessoal:Qual seria a diferença em termos de performance ?
procedure Altere_Panel1(Panel:TPanel); begin Panel.Caption := ´Sem var´; end; procedure TForm1.Altere_Panel2(var Panel:TPanel); begin Panel.Caption := ´Com var´; end;
Siam
Curtidas 0
Respostas
Michael
24/10/2005
Nenhuma, pois TPanel é um objeto e, portanto, parâmetros do tipo objetos já são referências por si só.
Var só é relevante para variáveis nativas (raw types), constantes tipadas(com a diretiva {$J} ativada), ponteiros deferenciados, campos (fields) e variáveis indexadas.
[]´s
Var só é relevante para variáveis nativas (raw types), constantes tipadas(com a diretiva {$J} ativada), ponteiros deferenciados, campos (fields) e variáveis indexadas.
[]´s
GOSTEI 0
Siam
24/10/2005
Mas quando vc passa um objeto com [b:c8a526773f]var[/b:c8a526773f], vc não estaria passando o ponteiro do ponteiro ?
GOSTEI 0
Siam
24/10/2005
Veja uma conversão de C++ p/ Delphi:
Em C Note que Valor é passado por ponteiro(*Valor) de Data_ptr que é outro ponteiro.
Em DelphiNeste caso não é passado o ponteiro do ponteiro da estrutura Data ?
Em C
typedef uint32 int_Return;
typedef struct data {
uint16 Ano;
uint8 Mes;
uint8 Dia;} Data, *Data_ptr;
int_Return Faca_Algo(Data_ptr *Valor);Em Delphi
type Data_ptr = ^Data Data = record Ano :Word; Mes :Byte; Dia :Byte; end; function Faca_Algo(var Data_ptr):DWord;
GOSTEI 0
Siam
24/10/2005
Onde lê-seLeia-se
function Faca_Algo(var Data_ptr):DWord;
function Faca_Algo(var Data:Data_ptr):DWord;
GOSTEI 0
Massuda
24/10/2005
...não estaria passando o ponteiro do ponteiro ?
Está correto. Todo objeto é um ponteiro desreferenciado automaticamente pelo Delphi. Em termos práticos, deve ser mais rápido usar a versão sem o var pois (1) elimina um redirecionamento/desreferenciamento e (2) (no seu exemplo usando TPanel) o objeto passado como argumento não será alterado dentro da procedure (está alterando apenas as propriedades dele).Neste aspecto, [b:3a0ed43bbe]const[/b:3a0ed43bbe] tem o mesmo funcionamento de [b:3a0ed43bbe]var[/b:3a0ed43bbe], só que o ponteiro passado é read-only.
GOSTEI 0
Michael
24/10/2005
Nildo, está por aí? Dê o ar da graça com seu conhecimento sobre memória... ;-)
[]´s
[]´s
GOSTEI 0
Siam
24/10/2005
Conversando com alguns colegas, alguns acharam o que eu acho, mas a grande maioria não soube responder:
Executar um método ou função utilizando [b:a533e173b2]var[/b:a533e173b2] não é mais rápido do que sem [b:a533e173b2]var[/b:a533e173b2] ? Sempre achei que fosse por evitar a cópia dos parâmetros para a pilha; pois só é passado o ponteiro(4 bytes) de cada argumento.
Executar um método ou função utilizando [b:a533e173b2]var[/b:a533e173b2] não é mais rápido do que sem [b:a533e173b2]var[/b:a533e173b2] ? Sempre achei que fosse por evitar a cópia dos parâmetros para a pilha; pois só é passado o ponteiro(4 bytes) de cada argumento.
GOSTEI 0
Michael
24/10/2005
Depende dos parâmetros. Objetos já são passados por referência. Como o Massuda disse, o Delphi já os deferencia de forma transparente. Qdo vc acessa um objeto, é mais ou menos assim que o Delphi faz:
[]´s
Objeto^.Propriedade
[]´s
GOSTEI 0
Massuda
24/10/2005
Executar um método ou função utilizando [b:e4164d22bb]var[/b:e4164d22bb] não é mais rápido do que sem [b:e4164d22bb]var[/b:e4164d22bb] ? Sempre achei que fosse por evitar a cópia dos parâmetros para a pilha; pois só é passado o ponteiro(4 bytes) de cada argumento.
No seu primeiro exemplo, como é um objeto, sempre é passado um ponteiro na pilha, portanto não faz diferença... haveria diferença se fosse um record, como é o caso do seu segundo exemplo...function Faca_Algo(var X: Data):DWord; // ...equivale a... function Faca_Algo(X: Data_ptr):DWord;
GOSTEI 0
Michael
24/10/2005
Uma correção: eu escrevi deferenciar, mas o mais adequado seria [b:4520070d43]de-referenciar[/b:4520070d43], ou [b:4520070d43]derreferenciar[/b:4520070d43] (credo), em uma tradução literal, já que não existe [b:4520070d43]to dereference[/b:4520070d43] na língua portuguesa.
[b:4520070d43]Deferenciar[/b:4520070d43] é outra coisa completamente diferente... hehehehe
[]´s
[b:4520070d43]Deferenciar[/b:4520070d43] é outra coisa completamente diferente... hehehehe
[]´s
GOSTEI 0
Siam
24/10/2005
No seu primeiro exemplo, como é um objeto, sempre é passado um ponteiro na pilha...
Sim, estava me referindo aos parâmetros maiores que 4 bytes, como strings, arrays, etc...GOSTEI 0
Massuda
24/10/2005
estava me referindo aos parâmetros maiores que 4 bytes, como strings, arrays, etc...
Com exceção de objetos, AnsiString´s e arrays dinâmicos, na maioria dos casos se você usar var (ou const) estará economizando a pilha do programa; em termos de velocidade, se houver diferença, será muito pequena.GOSTEI 0