[Delphi] Dynamiczna tablica i AllocMem

0

Mam record:

type
TBaza = record
 Imie: ShortString;
 Nazwisko: ShortString;
 Liczba: Integer;
end;

Do tego dynamiczną tablice:

var
 Baza: Array of TBaza;

Zwiększam przez SetLength(Baza, Length(Baza)+1) a zwalniam przez ZeroMemory(@Baza,sizeOf(Baza));
I teraz tak, taka tablica może mieć kilkanaście tysięcy rekordów, da sie jeszcze jakoś zoptymalizować użycie RAM? W książce wspomnieli tylko coś o AllocMem ale nie wiem jak z tego skorzystać aby było dobrze.
Przykład:

Begin
Baza := AllocMem(SizeOf(TBaza));
SetLength(Baza, Length(Baza)+1);
Baza^[High(Baza)].Imie := 'Maciej';
Baza^[High(Baza)].Nazwisko := 'Kowalski';
........
FreeMem(Baza);
End;

Czy to jest dobrze? FreeMem używam wtedy gdy nie potrzebuje już w ogóle tablicy, tj. przy zamykaniu aplikacji i nie musze już stosować ZeroMemory(@Baza,sizeOf(Baza));? Z góry dzięki.

0

zmiana rozmiaru

SetLength(Baza, Length(Baza)+1);

czyszczenie i zwalnianie pamięci

SetLength(Baza, 0);
Baza := nil;

AllocMem jest niepotrzebny.

Jeśli jest to coś na kształt tabeli z bazy to może zainteresuj się czymś na kształt MemoryData (np. z pakietu JEDI albo Rx) - to DataSource, który trzyma dane w RAMie i obsługuje się go jak zwykły TTable z możliwością definiowania indexów, zakładania filtrów itp

0

Czyli to jest to samo co ZeroMemory(@Baza,sizeOf(Baza));?
A co do Jedi. To użycie AllocMem jest tutaj zbędne? Nie wiele pamięci zyskam? Potestuje te z Jedi...

0

SetLength już samo sobie przydzieli pamięć i nie musisz tego robić przez AllocMem, tak samo SetLength(..., 0) zwalnia tą pamięć. Baza := nil powoduje tyle, że mówimy kompilatorowi, że nie będziemy już tej zmiennej używać i pamięć po niej może zostać uznana za wolną (jeśli baza jest zmienną globalną to bez powyższej operacji pamięć po niej zostanie uznana za wolną przy zamykaniu programu, a jak jest zmienną lokalną jakiejś funkcji po wyjściu z tej funkcji) - niejako zmniejszamy czas życia zmiennej w ten sposób

1 użytkowników online, w tym zalogowanych: 0, gości: 1