PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : record, class - Unterschied?


Elladan
2005-06-19, 16:43:19
Hallo,
Ich programmier in Delphi.
Folgende Fragen hätte ich (mal wieder):
1. Was ist der Unterschied zwischen einer class und record?

Ich habe in meinem Programm ein array von einer class erstellt und jetzt das ganze nicht mehr als class sondern als record definiert.

Da ich von der ganzen Matie nicht viel Ahnung habe...
2. wundere ich mich dadrüber, warum mein Programm jetzt ziemlich lange beim zum Beenden braucht (mehrere Minuten).

Codebeispiel:

TVegetation = record
Pflanzenart2: integer;
textur: string;
Position: TVector;
breite, hoehe: Single;
rotation: Single;
vergroesserungsfaktor: Single;
end;
...
const feldgroesse = 1000;
...
var Vegetation: array[0...feldgroesse] of array[0..feldgroesse] of TVegetation;
...


Vorher hatte ich statt "record" "class" dort stehen, und am Programmende natürlich noch in initialization
for ad2:= 0 to laenderzahl do
for ad:= 0 to feldgroesse do
Vegetation[ad2,ad]:=TVegetation.Create;
und in finalization
for ad2:= 0 to laenderzahl do
for ad:= 0 to feldgroesse do
Vegetation[ad2,ad].Destroy;

Ich hoffe, dass trotz meiner schwammigen Ausducksweise, mir wieder einmal jemand helfen kann,
Gruß und Vielen Dank,
Elladan

Xmas
2005-06-19, 18:27:12
AFAIK ist record ein Werttyp und class ein Verweistyp, wie struct und class bei C#. Das heißt das Variablen eines record-Typs die Instanz selbst sind, während Variablen eines class-Typs nur auf eine Instanz verweisen. Bei einer Zuweisung wird eine record-Instanz vollständig kopiert, bei einer class-Instanz wird nur die Referenz kopiert, es können also mehrere Variablen auf dasselbe Objekt zeigen.

Elladan
2005-06-19, 18:55:08
Mhm...
1. und wenn ich jetzt ein array von einem record habe, habe ich 1000 records, anstatt 1000 verknüpfungen auf eine class?
2. Dauert desshalb das Beenden des Programmes auch so lange (der prozess läuft im task-manager noch weiter)?

3. Was ist denn von der Performance her besser: records oder class?

grakaman
2005-06-20, 09:28:50
3. Was ist denn von der Performance her besser: records oder class?

Das kommt darauf an. Wenn das so ist, wie Xmas sagte, dann kann man in bestimmten Situationen mit records eben den Overhead an Objekt Erstellungen reduzieren, weil z.B. ein Wertetyp Array alle Daten im Array enthält. Also wenn du z.B. ein int[] hast, dann sind alle Daten in diesem Array drin und es gibt nur eine Objekterstellung. Wenn du aber z.B. eine dynamische ArrayList nimmst (oder wie das bei Delphi heißt :confused: ) und dort die ints reinpackst, wird eben für jeden int jeweils ein Objekt erstellt. Auf der anderen Seite kann sich die Performance aber auch verschlechtern, wenn man eben Wertetypen Methoden übergibt, da dort ja immer eine Kopie erstellt wird. Bei Wertetyp Arrays kann das sich entsprechend gravierend schlecht auswirken, wenn viele Daten drin sind. Deswegen sollte man eben benutzerdefinierte Wertetypen nur bei wirklich kleinen Datenstrukturen verwenden und ansonsten immer class.

Gruß,
grakaman

Elladan@schule
2005-06-20, 12:12:27
Danke, habt mir sehr geholfen!

Vedek Bareil
2005-06-20, 13:02:47
Mhm...
1. und wenn ich jetzt ein array von einem record habe, habe ich 1000 records, anstatt 1000 verknüpfungen auf eine class?
2. Dauert desshalb das Beenden des Programmes auch so lange (der prozess läuft im task-manager noch weiter)?

3. Was ist denn von der Performance her besser: records oder class?also wenn ich mir deinen Code so angucke, sollte es eigentlich gar keinen Unterschied machen.
In der record-Variante erzeugst du ein 2-dimensionales Array der Größe feldgroesse*feldgroesse = 1000000, d.h. 1 Million Instanzen des Records.
In der class-Variante erzeugst du durch die Deklaration in der var-Zeile erstmal nur ein Array aus 1 Million Referenzen, was natürlich zunächst weniger Speicherplatz benötigt. Du rufst bei der Initialisierung dann aber mit Create den Konstruktor der Klasse auf, und das wiederum feldgroesse*feldgroesse = 1000000 mal. So daß du auch da wieder 1 Million Instanzen hast.
Soweit ist der Speicherbedarf in beiden Fällen gleich groß.
Was ich mir vorstellen könnte wäre, daß in der class-Version dadurch, daß dynamisch Speicher alloziert wird - der Aufruf von Create in Delphi entspricht in etwa einem new in C++:
// Delphi:
for ad2:= 0 to laenderzahl do
for ad:= 0 to feldgroesse do
Vegetation[ad2,ad]:=TVegetation.Create;
// C++:
for (ad2 = 0; ad2 < laenderzahl; ad2++)
for (ad=0; ad < laenderzzahl; ad++)
Vegetation[ad2][ad] = new TVegetation;
mehr Overhead entsteht und dadurch die Deallozierung beim Programmende länger dauert.
Dann aber sollte die class-Version die langsamere sein, nicht wie bei dir die record-Version...

Elladan@school
2005-06-21, 09:36:37
@ Vedek Bareil
mhm, thx.
aber die class version braucht, wie du gesagt hast, länger beim starten, aber die record version zieht sich beim Beenden unendlich in die Länge...