GARANTIR DESCONTO

Fórum var #300470

24/10/2005

0

Pessoal:
procedure Altere_Panel1(Panel:TPanel);
begin
  Panel.Caption := ´Sem var´;
end;
procedure TForm1.Altere_Panel2(var Panel:TPanel);
begin
  Panel.Caption := ´Com var´;
end;
Qual seria a diferença em termos de performance ?


Siam

Siam

Responder

Posts

24/10/2005

Michael

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


Responder

Gostei + 0

24/10/2005

Siam

Mas quando vc passa um objeto com [b:c8a526773f]var[/b:c8a526773f], vc não estaria passando o ponteiro do ponteiro ?


Responder

Gostei + 0

24/10/2005

Siam

Veja uma conversão de C++ p/ Delphi:
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);
Note que Valor é passado por ponteiro(*Valor) de Data_ptr que é outro ponteiro.

Em Delphi
type Data_ptr = ^Data
     Data = record
       Ano :Word;
       Mes :Byte;
       Dia :Byte;
end;
function Faca_Algo(var Data_ptr):DWord;
Neste caso não é passado o ponteiro do ponteiro da estrutura Data ?


Responder

Gostei + 0

24/10/2005

Siam

Onde lê-se
function Faca_Algo(var Data_ptr):DWord;
Leia-se
function Faca_Algo(var Data:Data_ptr):DWord;



Responder

Gostei + 0

24/10/2005

Massuda

...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.


Responder

Gostei + 0

24/10/2005

Michael

Nildo, está por aí? Dê o ar da graça com seu conhecimento sobre memória... ;-)

[]´s


Responder

Gostei + 0

24/10/2005

Siam

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.


Responder

Gostei + 0

24/10/2005

Michael

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:

Objeto^.Propriedade


[]´s


Responder

Gostei + 0

24/10/2005

Massuda

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;



Responder

Gostei + 0

24/10/2005

Michael

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


Responder

Gostei + 0

24/10/2005

Siam

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...


Responder

Gostei + 0

24/10/2005

Massuda

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar