![]() |
Delphi-Version: XE3
Generische Objectlist: Itemcount <> Count?
Ich habe eine TObjectlist aus System.Generics.Collections, erzeuge 7 Objekte und füge sie mit add hinzu. Ich schreibe einfach mal den Zustand nach jedem Add:
0: Items leer, count = 0 1: 1 Objekt in Items, count = 1 2: 2 Objekte in Items, count = 2 3: 3 Objekte und 1 nil in items, count = 3 -> wo kommt das nil her und warum habe ich 4 Items und einen count von 3? 4: 4 Objekte in items, count = 4 -> hier ist wieder kein nil und alles passt 5: 5 Objekte und 3 nil in items, count = 5 -> jetzt habe ich plötzlich 8 Items, 3 nil und trotzdem einen count von 5? 6: 6 Objekte und 2 nil in items, count = 6 -> und wieder ein nil verschwunden aber trotzdem mehr items als count 7: 7 Objekte und 1 nil in items, count = 7 -> nur noch 1 nil, die korrekte Anzahl Objekte und immernoch 1 Item mehr als count? Ist das ein Bug oder mache ich irgendwas falsch? |
AW: Generische Objectlist: Itemcount <> Count?
Items ist intern ein Array. Wenn ein Item hinzugefügt werden soll, aber das interne Array voll ist, muss das Array vergrößert werden. Da das ein relativ aufwändiger Prozess ist (d.h. O(n) Laufzeit, da ggf. das gesamte Array kopiert werden muss an eine Stelle im Speicher, wo ausreichend viel Platz am Stück verfügbar ist), wird das Array nicht um "1" vergrößert, sondern um einen gewissen Faktor, damit folgende Add-Operationen schneller durchgeführt werden können.
Diese "Kapazität" der Liste kann man über die Eigenschaft "capacity" auch gezielt abfragen oder setzen. Letzteres ist z.B. empfehlenswert, wenn man weiß, dass jetzt in einer Schleife 100.000 Elemente eingefügt werden sollen. Du machst also nichts falsch, und das ist kein Bug, sondern ein Feature. ;-) |
AW: Generische Objectlist: Itemcount <> Count?
Wieder was gelernt. Danke :D
|
AW: Generische Objectlist: Itemcount <> Count?
Gibt es auch bei TBytesStream, da ist Length(Bytes) das nächstgröße 4 Kibi. Wenn du dir also eine Methode schreibst, die ein TBytes akzeptiert, musst du auch die Länge übergeben, wenn du Daten aus einem TBytesStream verarbeiten können möchtest.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz