Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Implementierung TList<> (https://www.delphipraxis.net/210235-implementierung-tlist.html)

freimatz 22. Mär 2022 07:02

Implementierung TList<>
 
Hallo,
wie ist denn TList<> intern implementiert. Mich interessiert die Speicherung der Daten.
Wenn ich z.B. eine TList<TLabel> ist TLabel eine Klasse. Dann wird es wie ich mich vage erinnere einen Speicherblock geben, der Referenzen (also Pointer) auf die Labels enthält.

Wenn ich dagegen z.B. ein TList<Byte> habe, sind es da Referenzen auf Bytes und die Bytes sind separat gespeichert? Oder werden in dem Speicherblock die Bytes selbst gespeichert?

Zusatzfrage: wie ist es bei Spring4D

Der schöne Günther 22. Mär 2022 07:09

AW: Implementierung TList<>
 
Aus eben dem Grund gibt es neben einer TList<T> noch die TObjectList<T>:

https://docwiki.embarcadero.com/Libr...t%20is%20freed.

freimatz 22. Mär 2022 07:20

AW: Implementierung TList<>
 
Danke für Deine Rückmeldung. Leider beantwortet das keine meiner Fragen. Zudem ist TObjectList ein Nachfahren von TList und ändert an der Art der Speicherung nichts.

Habe nun selber getested. In function TList<T>.Add(const Value: T): Integer; gibt es eine Fallunterscheidung. Bytes und andere native Typen werden auch als solche gespeichert.

Bleibe noch die Frage nach Spring4D.
Nachtrag: habe auch mal reingeschaut, verstehe das aber zu wenig.

BerndS 22. Mär 2022 08:23

AW: Implementierung TList<>
 
Intern erfolgt die Zuweisung in der Unit System.Generics.Collections per ListHelper.
Delphi-Quellcode:
function TListHelper.InternalAdd1(const Value): Integer;
...
PByte(FItems)[Result] := Byte(Value);
...
Das sieht für mich so aus, dass intern ein dynamisches Array of Byte erstellt wird.
Da du anscheinend die Pro hast, sollte das im Debugger mit F7 im Add nachvollziehbar sein.

freimatz 22. Mär 2022 09:13

AW: Implementierung TList<>
 
Hallo,
bin irritiert. Genau das schrieb ich doch in meinem Beitrag vor Deinem :gruebel:

TiGü 22. Mär 2022 09:37

AW: Implementierung TList<>
 
Ich bin eh irritiert über die Fragestellung.
Dir liegen doch die Quelltexte und der Debugger vor.
Was genau hast du im ersten Beitrag erwartet?
Das es jemand nochmal in Prosaform beschreibt?

freimatz 22. Mär 2022 10:30

AW: Implementierung TList<>
 
Ehrlich: ja. (Wobei Prosa muss es ja nicht sein, es sind ja nur zwei Optionen :) )
Auf die Idee den Debugger zu nehmen und in der RTL rumzusuchen kam ich zuerst gar nicht. :oops:
Andererseits - auch dachte ich das weiss vielleicht gerade jemand.

Was Spring4D ist es nach wie vor so, das ich da nicht so recht weiter komme. Einerseits ist Delphi mal wieder störisch und andererseits verstehe ich den Code nicht so recht.

TiGü 22. Mär 2022 12:44

AW: Implementierung TList<>
 
Also ohne es selbst zu nutzen, aber es ist doch relativ einfach zu durchschauen?
Du machst schon so lange Delphi und schreibst ab und an, was für eine sophisticated Firma ihr habt?!
:wiejetzt:

https://bitbucket.org/sglienke/sprin...tions.Base.pas

Die Spring4D-TList<T> leitet von TListBase<T> ab:

Delphi-Quellcode:
function TListBase<T>.Add(const item: T): Integer;
begin
  Result := Count;
  Insert(Result, item);
end;
Das Add ruft also wie gebräuchlich die Insert-Methode auf:

https://bitbucket.org/sglienke/sprin...ions.Lists.pas

(Kommentare mit Zahlen von mir)
Delphi-Quellcode:
procedure TList<T>.Insert(index: Integer; const item: T);
begin
{$IFDEF SPRING_ENABLE_GUARD}
  Guard.CheckRange((index >= 0) and (index <= fCount), 'index'); // 1
{$ENDIF}

  EnsureCapacity(fCount + 1); // 2

  IncUnchecked(fVersion);
  if index <> fCount then // 3
  begin
    TArrayManager.Move(fItems, index, index + 1, fCount - index);
    TArrayManager.Finalize(fItems, index, 1);
  end;
  fItems[index] := item; // 4
  Inc(fCount); // 5

  Changed(item, caAdded); // 6
end;
1. Gucken ob der Index stimmt.
2. Ggf. das interne Array fItems: TArray<T>; vergrößern wenn der Platz nicht reicht
3. Wenn Index ungleich Count ist das Array umkopieren.
4. Neues Item auf Position im Array speichern.
5. Count erhöhen
6. Ggf. angemeldete Eventhandler rufen für "Hab Element hinzugefügt!"-Fall.

freimatz 22. Mär 2022 13:08

AW: Implementierung TList<>
 
Danke. Ich meine inzwischen auch die zweite Frage beantworten zu können.

Zitat:

Zitat von TiGü (Beitrag 1503779)
Also ohne es selbst zu nutzen, aber es ist doch relativ einfach zu durchschauen?
Du machst schon so lange Delphi und schreibst ab und an, was für eine sophisticated Firma ihr habt?!
:wiejetzt:

Für mich ist das leider nicht recht einfach durchzuschauen. Ja ich mache schon lange Delphi (und davor Turbo-Pascal). Code zu verstehen den anderen gemacht haben, habe ich grössere Mühe. Das liegt sicher an mir. (Und bei Prosa sind die Schwierigkeiten meist noch grösser.)

Stevie 22. Mär 2022 22:26

AW: Implementierung TList<>
 
Gut, dass du den Code aus Spring 1.2 gepostet hast und nicht aus develop (2.0), sonst hättest noch irgendwen verschreckt :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 Uhr.
Seite 1 von 2  1 2      

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