Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Vector für beliebige Record-Typen
Leto - Sa 23.07.05 18:33
Titel: Vector für beliebige Record-Typen
Mein "Problem" ist folgendes:
Aufgrund zahlreicher Operation in einer Schleife, die viele strukturierte Daten mitloggt, möchte ich es vermeiden Objekte teuer zu allozieren. Es handelt sich letzlich um verscheidene Daten von eigenen zusammengesetzten Typen, die nicht als Klassen repräsentiert werden müssen, sondern durch ihre Einfachheit als Records ausreichen. Diese sollen in dynamische Array-basierte Listen (wie TList, TObjectList) gespeichert werden, nur ich möchte ich teure New-Operatoren vermeiden (es sind sehr viele Datensätze) und habe deshalb einen simplen Vector mit geeigneter Kapazitäts- und Incrementstrategie gebaut, der genau diesen Datentyp verarbeitet. Das Problem ist nun, dass ich verschiedene Records in verschiedenen solcher Vectoren zu verwalten habe, ich muss daher jedes Mal wegen des anderen Record-Typs eine neuen Vectortyp haben. Das muss doch eleganter zu lösen sei? (So eine Art C++Templates in Delphi, wobei ich den bekannten Nachbau nicht unbedingt als 1. Wahl sehe).
Hoffe ich habe mich einigermaßen verständlich ausgedrückt.
Udontknow - Sa 23.07.05 19:04
Hallo!
Ich schau erstmal, ob ich dein Problem richtig verstanden habe:
-Du hast verschiedene Recordtypen, die auch unterschiedliche Größen haben.
-Diese unterschiedlichenRecords sollen alle in eine Liste (also TList-Nachfahre oder etwas ähnliches) und auch von nur einer Liste aus erstellt werden.
-Du willst beim Füllen der Liste bzw. beim Erstellen der unterschiedlichen Records Speicheralloziierungen auf ein Minimum beschränken.
-Du hast den vorherigen Punkt bereits für eine Liste mit ein und demselben Recordtyp erledigt, die Methode soll also für unterschiedliche Recordtypen funktionieren.
Dem entnehme ich, daß du also in dieser Liste für einen Recordtypen am Anfang Speicher reservierst und diesen dann nach Gutdünken für deine Records aufteilst. Damit wiederholst du das, was der Delphi-Speicher-Manager bereits für dich tut. Nicht jeder Aufruf von New bzw. GetMem wird automatisch an das Betriebssystem durchgeschleusst, stattdessen teilt dir das Programm unter Umständen Speicher zu, den du gerade zuvor wieder freigegeben hast. Aus diesem Grunde relativieren sich häufig auch Aussagen wie "Objekte instanziieren / Getmem (New) aufrufen dauert zu lange" .
Nichts destotrotz:
Um den Speicher zuzuteilen, hast du ja einen Pointer, der auf den einmalig zugewiesenen Speicherbereich zeigt, und wahrscheinlich eine Art Offset, an dem du erkennst, wieviel du bereits von dem Speicher für die Einträge in der Liste verbraten hast. Bei ein und demselben Recordtyp wird der Offset natürlich immer um dieselbe Anzahl nach oben geschraubt. Für unterschiedliche Records musst du dann natürlich diesen Offset auch um unterschiedliche Anzahl Bytes erhöhen. Ausserdem benötigst du ein Identifikationsmerkmal, an dem du erkennst, um was für einen Record es sich handelt. Wenn du unter 257 Recordtypen hast, reicht ein Byte als ID.
Cu,
Udontknow
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!