Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Arbeiten mit TList (https://www.delphipraxis.net/121223-arbeiten-mit-tlist.html)

mirage228 24. Sep 2008 13:42

Re: Arbeiten mit TList
 
Zitat:

Zitat von grenzgaenger
Zitat:

Zitat von Bomberbb
eine bessere Speicherverwaltung als ein dynamisches Array.

tut mir leid dich enttäuschen zu müssen, TList ist ein dynamisches Array ... :angel2:

Ein "gefaketes" dynamisches Array um genau zu sein ;)

grenzgaenger 24. Sep 2008 13:44

Re: Arbeiten mit TList
 
Zitat:

Zitat von bernau
Zitat:

Zitat von grenzgaenger
tut mir leid dich enttäuschen zu müssen, TList ist ein dynamisches Array ... :angel2:

Was wäre denn performanter als eine TList?



Gerd

kommt auf den fall an.


Zitat:

Zitat von mirage228
Zitat:

Zitat von grenzgaenger
Zitat:

Zitat von Bomberbb
eine bessere Speicherverwaltung als ein dynamisches Array.

tut mir leid dich enttäuschen zu müssen, TList ist ein dynamisches Array ... :angel2:

Ein "gefaketes" dynamisches Array um genau zu sein ;)

weshalb gefakte? das ist ein pures dyn Array. nur mit ein paar verwaltungsfunktionen versehen.

mirage228 24. Sep 2008 13:46

Re: Arbeiten mit TList
 
Zitat:

Zitat von grenzgaenger
weshalb gefakte? das ist ein pures dyn Array. nur mit ein paar verwaltungsfunktionen versehen.

Es ist es als statisches Array deklariert (PPointerList oder so) und wird manuell verwaltet... könnte mir schon vorstellen, dass die Klasse aus einer Zeit ohne dynamische Arrays stammt (Delphi 3 und früher) und es daher noch so gelöst wurde... :gruebel:

grenzgaenger 24. Sep 2008 13:51

Re: Arbeiten mit TList
 
Zitat:

Zitat von mirage228
Zitat:

Zitat von grenzgaenger
weshalb gefakte? das ist ein pures dyn Array. nur mit ein paar verwaltungsfunktionen versehen.

Es ist es als statisches Array deklariert (PPointerList oder so) und wird manuell verwaltet... könnte mir schon vorstellen, dass die Klasse aus einer Zeit ohne dynamische Arrays stammt (Delphi 3 und früher) und es daher noch so gelöst wurde... :gruebel:

danke, wieder etwas dazugelernt. ist tatsächlich ein statisches array

littleDave 24. Sep 2008 13:55

Re: Arbeiten mit TList
 
Zitat:

Zitat von mirage228
Ein "gefaketes" dynamisches Array um genau zu sein ;)

Jedoch hat eine TList den Vorteil, dass nur die Pointer auf die Daten in der Liste gespeichert werden. Wenn man jetzt zwei Datensätze austauschen will, muss nur die beiden Pointer vertauscht werden und nicht der Inhalt der Daten. Somit hat TList schon einen großen Geschwindigkeitsvorteil zwischen einem array of irgendwas. Ich glaube, dass TList intern mit Speicherblöcken arbeitet - das array wird - sagen wir mal - mit 64 Pointern initialisiert. Count wird einfach auf 0 gesetzt. Jetzt kann man extrem schnell 64 beliebige Daten in die Liste hinzufügen, ohne dass die Liste vergrößert werden muss. Es wird einfach Count jeweils erhöht und der Pointer wird in den bereits reservierten Speicherbereich geschrieben. Das Löschen von Elementen hat natürlich noch das Problem, dass die danachfolgenden Pointer zurückgeschoben werden müssen, jedoch ist das sehr schnell, da die Pointer in den allermeisten Fällen weniger Speicher verbrauchen als die Daten, auf den die Pointer zeigen.

Bomberbb 24. Sep 2008 14:03

Re: Arbeiten mit TList
 
Meine Intention hierbei war einfach, dass bei Add nur einmal neuer Speicher für den neuen Punkt angefordert wird. Beim Arbeiten mit dynamischen Arrays kann es meines Wissens nach oft sein, dass das komplette Array im Speicher verschoben wird. Wenn ich einige hundert Punkte habe und beim hinzufügen immer ein setlength mache, finde ich das nicht ganz optimal.

Gut das gleiche hätte auch eine verkette Liste getan, aber die hätte ich komplett implementieren müssen...

So nun hab ich mir auch mal ein wenig Quelltext von TList angesehen.
@littleDave
TPointerList ist so definiert:
Delphi-Quellcode:
 MaxListSize = Maxint div 16;

 TPointerList = array[0..MaxListSize - 1] of Pointer;
Also wird gleich für die maximale Länge der Liste Speicher für die Pointer reserviert und dieser auch nicht zur Laufzeit verändert.

Beim Löschen werden nicht alle folgenden Elemente zurückgeschoben, sondern nur der letzte gültige Pointer an die leere Stelle kopiert.

bernau 24. Sep 2008 15:00

Re: Arbeiten mit TList
 
Zitat:

Zitat von Bomberbb
Also wird gleich für die maximale Länge der Liste Speicher für die Pointer reserviert und dieser auch nicht zur Laufzeit verändert.

Ne.Ne. Es wird nur ein Zeiger auf eine TPointerlist-Struktur gelegt. Der Speicher ist nicht reserviert. Wäre schlimm wenn es so wäre, denn maxint hat einen Wert von rund 2.000.000.000 wenn direkt so viele Pointer angelegt würden, dann hast du mit einem Schlag 8GB verbraucht. :-)


Gerd

littleDave 24. Sep 2008 15:39

Re: Arbeiten mit TList
 
TPointerList ist nur ein Dummy-Typ. In TList wird ja einfach PPointerList verwendet. Der Compiler weiß dann, dass der Speicher, auf den der Pointer zeigt, ein array ist. Somit kann man direkt PPointerList[i] aufrufen und der Compiler macht das restliche. Man könnte TPointerList auch definieren als array[0..0] of pointer. Es wird das gleiche rauskommen. Der Typ ist nur dafür da, damit man die eckigen Klammern benutzen kann.

Zitat:

Zitat von Bomberbb
@littleDave
TPointerList ist so definiert:
Delphi-Quellcode:
 MaxListSize = Maxint div 16;

 TPointerList = array[0..MaxListSize - 1] of Pointer;
Also wird gleich für die maximale Länge der Liste Speicher für die Pointer reserviert und dieser auch nicht zur Laufzeit verändert.

Gott sei dank: nein. Schau dir mal die Funktion TList.SetCapacity an. Dort steht ein ReallocMem, womit neuer Speicher angefragt bzw. wieder freigegeben wird.

Zitat:

Zitat von Bomberbb
Beim Löschen werden nicht alle folgenden Elemente zurückgeschoben, sondern nur der letzte gültige Pointer an die leere Stelle kopiert.

Leider auch nein:
Delphi-Quellcode:
procedure TList.Delete(Index: Integer);
begin
  { ... }
  if Index < FCount then
 
    // Mit dem Move-Befehl werden alle Pointer, die nach index kommen,
    // um eine Position (4 Byte bei 32Bit-Systemen) nach vorne geschoben

    System.Move(FList^[Index + 1], FList^[Index],
      (FCount - Index) * SizeOf(Pointer));

  { ... }
end;

Bomberbb 24. Sep 2008 16:02

Re: Arbeiten mit TList
 
Stimmt auch wieder ...
Nun ja, auf jeden Fall hab ich bei diesem Thread einiges gelernt! :-D
Danke dafür!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz