AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Arbeiten mit TList

Ein Thema von Bomberbb · begonnen am 24. Sep 2008 · letzter Beitrag vom 24. Sep 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#11

Re: Arbeiten mit TList

  Alt 24. Sep 2008, 13:42
Zitat von grenzgaenger:
Zitat von Bomberbb:
eine bessere Speicherverwaltung als ein dynamisches Array.
tut mir leid dich enttäuschen zu müssen, TList ist ein dynamisches Array ...
Ein "gefaketes" dynamisches Array um genau zu sein
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#12

Re: Arbeiten mit TList

  Alt 24. Sep 2008, 13:44
Zitat von bernau:
Zitat von grenzgaenger:
tut mir leid dich enttäuschen zu müssen, TList ist ein dynamisches Array ...
Was wäre denn performanter als eine TList?



Gerd
kommt auf den fall an.


Zitat von mirage228:
Zitat von grenzgaenger:
Zitat von Bomberbb:
eine bessere Speicherverwaltung als ein dynamisches Array.
tut mir leid dich enttäuschen zu müssen, TList ist ein dynamisches Array ...
Ein "gefaketes" dynamisches Array um genau zu sein
weshalb gefakte? das ist ein pures dyn Array. nur mit ein paar verwaltungsfunktionen versehen.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#13

Re: Arbeiten mit TList

  Alt 24. Sep 2008, 13:46
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...
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#14

Re: Arbeiten mit TList

  Alt 24. Sep 2008, 13:51
Zitat von mirage228:
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...
danke, wieder etwas dazugelernt. ist tatsächlich ein statisches array
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#15

Re: Arbeiten mit TList

  Alt 24. Sep 2008, 13:55
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.
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#16

Re: Arbeiten mit TList

  Alt 24. Sep 2008, 14:03
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.
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.294 Beiträge
 
Delphi 12 Athens
 
#17

Re: Arbeiten mit TList

  Alt 24. Sep 2008, 15:00
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
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#18

Re: Arbeiten mit TList

  Alt 24. Sep 2008, 15:39
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 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 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;
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#19

Re: Arbeiten mit TList

  Alt 24. Sep 2008, 16:02
Stimmt auch wieder ...
Nun ja, auf jeden Fall hab ich bei diesem Thread einiges gelernt!
Danke dafür!!!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz