Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?

  Alt 4. Mai 2010, 09:36
Nee, stimmt schon. dyn Arrays werden automatisch freigegeben.

Delphi initialisiert es quasi mit der Länge 0.

SetLength Reallociert dieses nur.

Delphi-Quellcode:
procedure Test;
var a: array of Integer;
begin
  SetLength(a, 1);
end;
Code:
Unit3.pas.27: begin
004A0E24 55               push ebp
004A0E25 8BEC            mov ebp,esp
004A0E27 6A00             push $00    // a := nil;  aka  SetLength(a, 0);
004A0E29 33C0             xor eax,eax             // try
004A0E2B 55               push ebp                //
004A0E2C 686B0E4A00       push $004a0e6b          //
004A0E31 64FF30           push dword ptr fs:[eax] //
004A0E34 648920           mov fs:[eax],esp        //

Unit3.pas.28: SetLength(a, 1);
004A0E37 6A01             push $01
004A0E39 8D45FC          lea eax,[ebp-$04]
004A0E3C B901000000       mov ecx,$00000001
004A0E41 8B15000E4A00     mov edx,[$004a0e00]
004A0E47 E87C71F6FF      call @DynArraySetLength
004A0E4C 83C404           add esp,$04

Unit3.pas.29: end;
004A0E4F 33C0             xor eax,eax
004A0E51 5A              pop edx
004A0E52 59               pop ecx
004A0E53 59               pop ecx
004A0E54 648910           mov fs:[eax],edx    // finally
004A0E57 68720E4A00       push $004a0e72       //
004A0E5C 8D45FC          lea eax,[ebp-$04]   //
004A0E5F 8B15000E4A00     mov edx,[$004a0e00] //
004A0E65 E86A71F6FF      call @DynArrayClear //   SetLength(a, 0);
004A0E6A C3               ret                 // end;
004A0E6B E91849F6FF      jmp @HandleFinally  //
004A0E70 EBEA            jmp $004a0e5c       //
004A0E72 59               pop ecx             //
004A0E73 5D              pop ebp             //
004A0E74 C3               ret                 //
$2B or not $2B
  Mit Zitat antworten Zitat