Autor Beitrag
Leto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

XP
D7 Enterprise
BeitragVerfasst: Sa 23.07.05 18:33 
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.

_________________
Carpe Noctem
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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