Nun war der Record im letzten Post recht klein und hatte nur 2 Felder. Im echten (Programmierer) Leben hat man es aber oft mit sehr umfangreichen Records, die z.T. noch Unterstrukturen enthalten, zu tun.
Wenn ich in einer Procedure eine Variable oder einen Parameter des Typs des Records definiere, dann reserviert der Compiler für diese Variable soviel Speicher auf dem Stack, wie für die gesamten Daten des Records benötigt werden. Wird ein Parameter des Recordtypen an eine lokale Variable des gleichen Typs übergeben, dann wird der Inhalt des gesamten Records kopiert.
Code: Alles auswählen
procedure Ausgabe(Beispiel : RBeispiel);
begin
writeln(Beispiel.Name, ' ', Beispiel.Alter);
end;
Code: Alles auswählen
procedure Ausgabe(Beispiel : TBeispiel);
begin
writeln(Beispiel.Name, ' ', Beispiel.Alter);
end;
Wenn Ausgabe mit dem Record aufgerufen wird, dann reserviert der Compiler Speicher für den gesamten Inhalt des Records.
Dann wird der gesamte Record in diesen reservierten Speicher kopiert und dann erst erfolgt der Aufruf der Procedure.
Bei umfangreichen Records und entsprechend häufigen Prozeduraufrufen verlangsamt das den Programmablauf enorm.
Im Fall der Ausgabe mit der Klasse kann der Aufruf direkt erfolgen, da die Klasse im sog. Heapspeicher angelegt wurde und nur die Adresse der Instanz übergeben werden muß.
Aber die Klassen können noch viel mehr!
Mehr dazu im nächsten Post.