Ich weiß, dass Arrays
in .net
auf eine zusammenhängende Art gespeichert ist. (in mem)
Ich weiß auch, dass List<..>
nicht ist. (naja ... nicht alle Listentypen ... siehe meine 2. Frage)
Von hier habe ich 2 Fragen
Ich weiß, dass nach 4,8,16 ... Elemente in eine Liste eingefügt wurden - die Liste reallocate
selbst im Speicher.
Ich weiß auch, dass ich ihm die Capacity
in ctor schicken kann, um ihn wissen zu lassen, in welcher Größe ich ihn erschaffen werde (um die Neuzuteilung zu reduzieren).
Die Frage ist warum ? Er speichert sich NICHT zusammenhängend, warum kümmert er sich sich selbst zuweisen? (Er muss keine freien & zusammenhängenden Speicherzellen finden)
Warum wird die Liste mit Strukturen im zusammenhängenden Speicher im Gegensatz zu einer Liste von Klassen zugeordnet?
List<T>
speichert Speicher zusammenhängend. Intern verwendet es ein Array für seinen Speicher. Wenn Sie die Kapazität erreicht haben, wird ein neues Array zugewiesen und der Speicher wird kopiert.
Dies gilt für List<T>
Instanzen von Klassen oder Strukturen. Wenn T
jedoch ein Referenztyp (Klasse) ist, speichern Sie eine zusammenhängende Referenzliste . Die Klasseninstanzen können nicht zusammenhängend sein, da Sie eine Liste einschließen können, die 100 Verweise auf dieselbe Instanz einer Klasse enthält.
Als Antwort auf Ihre spezifischen Fragen:
Die Frage ist warum? Er speichert sich nicht zusammenhängend, warum kümmert es ihn, sich neu zuzuordnen?
Es speichert die Elemente zusammenhängend, weshalb die Neuzuweisung erforderlich ist.
Warum wird List mit Strukturen im zusammenhängenden Speicher zugeordnet, im Gegensatz zu einer Liste von Klassen?
Beide werden zusammenhängend gespeichert, aber im zweiten Fall (Klassen) speichern Sie eine Liste von Referenzen auf eine Klasseninstanz.
1) alle Objekt Referenzen sind weiterhin zusammenhängend gespeichert
2) Eine Liste von Klassen muss die Objekte weiterhin wie gewöhnliche Objekte speichern lassen. Thay kann nicht in ein zusammenhängendes Array gezwungen werden - aber die Verweise auf sie können
Tags und Links arrays .net c# generics memory-management