ich will mir ne Matrixklasse schreiben. Nun bin ich am überlegen: Klasse machen oder record mit dazugehörigen Funktionen.
Programmiertechnisch bin ich natürlich für Klassen. Nur da ich in Delphi ja immer das create/free nutzen muss, frage ich mich wie schnell oder nicht schnell dabei der Delphi-Speichermanager ist. Bei so einer leichtgewichtigen Klasse, da könnt ich mir vorstellen, dass das Speicher reservieren und freigeben dann am längsten dauert. Weil die Matrix will ich anlegen, mal ne mul machen und wieder weghauen.
So aber das sind alles nur Vermutungen. Ich habe mich bisher damit noch nicht weiter befasst. Ich programmier mehr C++ und da versuch ich natürlich das new zu meiden und Stackobjekte zu nutzen. Daher würd ich gerne wissen, was da in Delphi die beste Variante ist.
MfG Pellaeon
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würde definitiv einen Record oder noch eher ein Array nehmen, vorallem, da die OpenGL-Funktionen mit Klassen nicht klar kommen und man eher einen Record oder ein Array übergeben kann (Records nur als packed, oder?).
Mit dem Speichermanager hat das eher wenig zu tun - Der Speicher muss doch in beiden Fällen reserviert werden. Der einzige Unterschied liegt darin, dass die Klasse noch ein wenig mehr verbraucht für die Virtual Method Table und Run-time type information.
Ich habe es auch bei mir so gelöst, dass ich arrays benutze und diese dann entsprechend übergebe.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Variablen im var-Bereich werden nicht allokiert. Die kommen auf den Stack! Beim create eines Objektes hingehen muss irgendeine Art von Speichermanager den Speicher des Objektes besorgen.
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Richtig. Wenn du ein Record im Varbereich hast wird nur der Pointer des Stacks verändert was einem Allozieren des Speichers nahe kommt. Nur dass der Speicher bereits existiert.
Aber je nachdem was du machen willst kannst du auch mit einem neueren Delphi (2006/2007?) Methode/Prozeduren in Records packen oder aber du benutzt Objects (bzw die heißen Object) das ist auch nichts anderes als ein Record mit Methoden. Da kannst du auch ableiten allerdings sind die die Vorläufer von TObject und sollten eigentlich nicht mehr benutzt werden. Ich rate auch in 99% der Fälle davon ab.
Also ich würde auch eher zu Record tendieren obwohl Object auch gehen würde.
Die Entscheidung ist ganz klar: Wenn schnell viele Instanzen angelegt und wieder freigegeben werden müssen ist das Record der Klasse vorzuziehen. Wenns um Speichersicherheit ankommt ist die Klasse die bessere Wahl.
Ein New/Dispose ist schneller als Create/Destroy, fällt aber erst dann ins Gewicht, wenns wirklich auf die Zeit ankommt.
Zudem werden Objekte in Delphi grundsätzlich auf dem Heap angelegt, lokal definierte Records auf dem Stack (ausser man legt sie explizit mit new an, wenn man z.B. ein Record als Funktionswert zurückgeben will).
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Ich kann da Sidorion nur zustimmen, denn wenn du eine komplette Engine schreiben würdest, wäre es wahrscheinlich am geschicktesten, einfach eine Engine-Klasse zu erstellen und je nachdem wie groß der Zeitabstand zwischen Erstellung und Freigabe ist eine Klasse zu nehmen oder eben ein Array/Record. Denn die Engine läuft die ganze Zeit, während Kleinigkeiten mit Klassen übertrieben sind. Du kannst außerdem viel schöner mit einem Array arbeiten: deklarieren, definieren und damit arbeiten. Während eine Klasse eigentlich zwei Mal erstellt wird: Die Klassendefinition und die Instanz (Beispiel Kamera) Kamera : TKamera;. Arrays haben glaube ich sogar noch den Vorteil dass diese über das System von alleine freigegeben werden, ein kleines SetLength(ArrayName, 0) würde ich dennoch nicht weglassen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich sags ja nur ungern. Aber SetLength(ArrayName, 0) deutet auf ein dynamisches Array hin und die befinden sich meines Wissens nach auch im Heap. Und die sind von der Verwaltung her komplexer als statische Arrays oder new/dispose. Zu mal du bei lokalen dynamischen Arrays auch immer noch etwas unsichtbaren Codes hast. Und zwar der der dafür sorgt, dass es sauber wegeräumt wird.
New/Dispose: So etwas ist sicher auch schneller als Klassen aber auch das fordert dem Speichermanager einiges ab. Hatte bei einem kleinen Testprogramm mal den witzigen Fall, dass ich anscheinend genau an einer Grenze des Speichermanagers lag und der Code so mehr als das 20 Fache seiner eigentlichen Zeit benötigt hatte. Als ich dann davor noch einen Dummy erzeugt hatte gings wie gewohnt schnell. Also wenn möglich und es wirklich zeitkritisch ist dann würde ich new/dispose mit bedacht einsetzen. Zu mal der Speicher dadurch auch Fragmentieren kann. Evtl in Spezialfällen sogar was eigenes basteln.
Wie schon mal erwähnt. Ich würde lokale Records empfehlen und beim "Zurückgeben" würde ich mit var Parametern arbeiten. Ein mit new erstelltes Record zurückgeben und dort freigeben ist ungünstig, da Stelle A etwas erstellt und Stelle B es freigeben muss. So etwas provoziert Speicherlecks, weil man das mal schnell vergessen kann.
@ Rückgabe: das Gleiche passiert auch mit Instanzen. Die einzige Abhilfe wäre die Arbeit mit Interfaces. Diese werden freigegeben, sobald keine Referenz mehr existiert.
@Varparameter: Lieber einen Out-Parameter nehmen. Dieser funktioniert wie var, kann aber nur Ergebnisse liefern. Damit ist dann auch für einen Benutzer ersichtlich, dass dieser Parameter zur Rückgabe benutzt wird.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.