Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Record oder Class - was ist sinvoller zu nutzen (https://www.delphipraxis.net/142120-record-oder-class-ist-sinvoller-zu-nutzen.html)

eholzer 22. Okt 2009 09:13


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

Klaus01 22. Okt 2009 09:20

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 Diskussion zu diesem Thema.

Grüße
Klaus

OldGrumpy 22. Okt 2009 10:57

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.

eholzer 22. Okt 2009 12:01

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

shmia 22. Okt 2009 12:37

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:
// Beispiele für einfache Records
TComplex = record
  rvalue, ivalue : double;
end;
T3DPoint = record
  x: integer;
  y: integer;
  z: integer;
end;
Sind die Daten umfangreicher, dann zahlt sich eine Klasse langfristig auf jeden Fall aus.
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.

Phoenix 22. Okt 2009 12:39

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.

guinnes 22. Okt 2009 12:45

Re: Record oder Class - was ist sinvoller zu nutzen
 
Zitat:

Zitat von Phoenix
(allein schon für die vtables die die Zeiger auf die Methoden der basisklasse(n) halten, auch wenn diese nie benutzt werden)

Das hört sich jetzt an, als ob jede Instanz eine eigene VTable hätte...

shmia 22. Okt 2009 12:53

Re: Record oder Class - was ist sinvoller zu nutzen
 
Zitat:

Zitat von Phoenix
Die Klasse braucht halt mehr Platz..

Der Grössenunterschied beträgt 4 Bytes pro Objekt.
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;

Apollonius 22. Okt 2009 12:55

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.

Zwoetzen 22. Okt 2009 13:03

Re: Record oder Class - was ist sinvoller zu nutzen
 
Diese Frage hatte ich vor einiger Zeit auch mal gestellt: Class vs. Record.
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:04 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