Zusammenhängender Speicher, der Missverständnisse in.net speichert?

8

Ссылка

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

  1. 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)

  2. Warum wird die Liste mit Strukturen im zusammenhängenden Speicher im Gegensatz zu einer Liste von Klassen zugeordnet?

Royi Namir 07.02.2012, 21:06
quelle

2 Antworten

19

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.

    
Reed Copsey 07.02.2012, 21:08
quelle
0

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

    
Dan Byström 07.02.2012 21:11
quelle