Denn die FGL Klassen funktionieren nicht mit Records (außer man erstellt eine separate Datei, mit mode Delphi in der man diese typen mit Operator = überlädt). Das ist mMn. aber ein ziemlich beschissener Hack, den ich falls möglich umgehen will.
Es gibt noch die Unit GVector, die kann das zwar, deren Interface ist aber an C++'s vector klasse angelehnt, und damit hat man statt add die funktion push_back, statt count size, etc. Was natürlich auch wieder verwirrend ist. Außerdem ist da das typing anders, so ist size z.B. ein SizeUInt, und damit wirft
Code: Alles auswählen
for i:=0 to vec.size-1 do
für einen Leeren vektor nen fehler (im debug buiöd oder im optimierten release läuft von 0 bis 2^64-1), was bedeutet man muss entweder ne While schleife machen oder sowas:
Code: Alles auswählen
for i:=0 to SizeInt(vec.Size) -1 do
was auch wieder beschissen ist
Eine weiter Option ist einfach mehrere Listen zu benutzen, z.B. angenommen man möchte eine Liste von ID's und Namen füllen. Dann kann man ja eine Integer Liste und eine String Liste führen. Das schreit aber nach Synchronisationsfehlern und ist damit auch vom tisch.
Für Strings kann man ja die TStringList nehmen, die kann Objects (also Pointer) mit den Strings speichern. Wenn ich jetzt aber nur eine Zahl speichern will ists absolut unsinnig einen 64 bit pointer auf einen 32 bit integer im Heap zu benutzen. Das sind mit Heap overhead locker 112 bit statt 32. Den Integer direkt in den Pointer zu schreiben geht zwar unter x86 ist aber eigentlich Undefiniert und damit nicht Portabel, fällt also auch raus.
Objects statt records zu verwenden ist zwar eine Möglichkeit, dann muss man sich aber um Ownership kümmern, was ich wenn möglich vermeiden will (außerdem ist das extra pointer chasen und die 64 bit pointer overhead in vielen Cases nicht erwünscht). Ums genau zu nehmen habe ich bei meinem letzen projekt wofür ich das gebraucht hab mit z.T. gigabyte großen listen gearbeitet, da ist der Overhead von Objekten inakzeptabel. Außerdem ist die Fehlende Cache lokalität durch das Pointer chasen ein absoluter Performance Killer
Ich benutz aktuell den gvector, ist aber auch ne Suboptimale Lösung (siehe oben). Daher wollte ich mal fragen wie ihr das so macht. Ich mein ich kann ja nicht der erste sein der eine Liste mit mehreren Objekten benutzen möchte