![]() |
Record oder Class - was ist sinvoller zu nutzen
Hallo,
ich möchte in einer Liste mehrere tausend Elemente verwalten. Ich könnte ein Element als Record oder als Class definieren. Die liste wird auf der basis von TList definiert. Was ist sinvoller für die Definition von Elementen zu nehmen: Record oder Class? Welche Vorteile/Nachteile gibt es dabei? Grüße Eric |
Re: Record oder Class - was ist sinvoller zu nutzen
Guten Morgen,
bei einer TList musst Du dich um die Speicherfreigabe der Objekte und Records selber kümmern. Bei einer TObjectList (wenn ownsObject = true) kann die ObjectListe dies für Object selber machen. [edit] noch eine ![]() Grüße Klaus |
Re: Record oder Class - was ist sinvoller zu nutzen
Eine Klasse hat einen gehörigen Overhead, ein Record eher wenig. Wenn Deine Objekte nur Daten halten, ist es idR sinnvoller, die als Records auszulegen. Gerade wenn man mehrere tausend Stück davon verwaltet. Bei Records könntest Du sogar ein dynamisches Array daraus machen - mit allen Vorteilen aber auch Stolperfallen die das mit sich bringt.
|
Re: Record oder Class - was ist sinvoller zu nutzen
Was ist mit dem Speicherverbrauch? Ich glaube die Records nutzen anderen Speicher als die Klassen?
Kann sich die Wahl zwischen Class und Records auf die geschwindigkeit auswirken? Danke für die Bemerkungen Eric |
Re: Record oder Class - was ist sinvoller zu nutzen
Entscheidungshilfe:
ist die Datenmenge pro Item eher gering, also z.B. ein Wertepaar oder ein Punkt im Raum dann ist ein Record sinnvoll:
Delphi-Quellcode:
Sind die Daten umfangreicher, dann zahlt sich eine Klasse langfristig auf jeden Fall aus.
// Beispiele für einfache Records
TComplex = record rvalue, ivalue : double; end; T3DPoint = record x: integer; y: integer; z: integer; end; Der "gehörige Overhead" ist halb so wild, denn ob der Compiler der Self-Pointer versteckt an eine Methode gibt oder ob man einen Record als Parameter normalen Prozeduren übergeben muss, macht kaum einen Unterschied. Wenn man extrem viele kleine Objekte braucht, kann der Record beim Erzeugen einen Vorteil verbuchen. Ein Objekt wird ja grundsätzlich mit 0x00 initialisiert; beim Record gibt's das nicht. |
Re: Record oder Class - was ist sinvoller zu nutzen
Naja, ob jetzt heap oder stack ist eigentlich wurscht.
Die Klasse braucht halt mehr Platz (allein schon für die vtables die die Zeiger auf die Methoden der basisklasse(n) halten, auch wenn diese nie benutzt werden) und sie braucht länger zum instanzieren. Sogar, wenn Du einen konstruktor auf Deinem Record hast (zum initalisieren z.B.). Records brauchen also weniger speicher und sind schneller erzeugt. Im großen und ganzen wirkt sich das allerdings nur dann wirklich aus, wenn Du häufig viele Instanzen brauchst. Den Gesamtspeicherverbrauch kann man heutzutage eher vernachlässigen, sofern Dir Klassen einen gewissen Komfort geben, der die Wartung/Handhabung der Sache später stark vereinfacht. |
Re: Record oder Class - was ist sinvoller zu nutzen
Zitat:
|
Re: Record oder Class - was ist sinvoller zu nutzen
Zitat:
Dazu kommen bei einem nochmal 4 Bytes für den Objektzeiger. Wenn man Records mit New auf dem Heap erzeugt, dann sind auch beim Record die 4 Bytes für den Zeiger fällig.
Delphi-Quellcode:
// benötigt 4 Bytes pro Instanz
TTestRecord = record x : integer; end; // benötigt 8 Bytes pro Instanz // + EINMALIG pro Klasse die VTABLE mit ~ 80 Bytes TTestKlasse = class(TObject) public x : integer; end; |
Re: Record oder Class - was ist sinvoller zu nutzen
Gibt es nicht mittlerweile noch einen (potentiellen) Monitor für jedes Objekt? Das wären nochmal vier Bytes.
|
Re: Record oder Class - was ist sinvoller zu nutzen
Diese Frage hatte ich vor einiger Zeit auch mal gestellt:
![]() Da wurden einige Vor- und Nachteile von Records bzw. Klassen aufgezählt. (Hmm, wieso hab ich da nicht mehr drauf geantwortet...? :gruebel: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 Uhr. |
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-2025 by Thomas Breitkreuz