Wie viel Speicher wird null-Zeiger verwenden?
In C#, wenn ich den folgenden code verwenden
Dictionary<int,object> dictionary = new Dictionary<int, object>();
dictionary.Add(1,null);
dictionary.Add(2,new object());
dictionary[2] = null;
Wie viel Speicher zugewiesen wird?
nicht jedes Objekt Referenz im Wörterbuch (dictionary[1], Wörterbuch[2]) nimmt einen Zeiger-Größe (32-oder 64-bit) auf dem heap? in anderen Worten, wenn ich Wörterbuch.Add(1,null) hilft der CLR automatisch erstellen 2-Allokationen auf dem heap, eine für die int und einen für einen null-Zeiger?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den null-Zeiger nicht zugeordnet werden keine zusätzlichen Speicher zu speichern, alles über den Haufen (da gibt es nichts zu speichern). Aber, Ihr Wörterbuch zu speichern hat die null-pointer selbst, das dauert nur so viel Platz wie jeden anderen Zeiger.
Ob jeder Anruf hinzufügen-Ergebnisse in neue Zuordnungen (zum speichern der Zeiger) oder nicht, hängt von der Wörterbuch-Umsetzung. In der Regel, es hat ein internes array wird die Größe neu, wie es notwendig ist.
In deinem Beispiel, würde ich davon ausgehen, dass genug Platz für ein paar Elemente, die bereits zugewiesen, wenn Sie, erstellen Sie das Wörterbuch. Also die add(1, null) wird keine Zuweisung mehr Raum.
Update: Die Standard anfänglichen Kapazität für Wörterbuch ist nicht angegeben. In .NET 4.0, es beginnt bei 0, eigentlich, so die erste Beurteilung erstellt die Speicher-array.
In sich selbst ein null-Zeiger wird dauern, bis 4 oder 8 bytes, abhängig davon, ob es läuft als 32-bit-oder 64-bit, wie Sie schon vermutet.
Es können mehr sein, als diese in einer bestimmten Sammlung. Die Umsetzung der
Dictionary<TKey, TValue>
verwendet ein array vonEntry<TKey, TValue>
Strukturen, die enthält zweiint
s sowie den Schlüssel und den Wert, und auch ein Integer-array verwendet im index in diesem array. Daher, auch wenn es keinen "Raum" (und im Allgemeinen gibt es) jeder Eintrag müsste 20bytes oder 24bytes Speicher (anstatt nur die 8 oder 12 einer durch die Größe der Schlüssel und Wert), die auf der Oberseite der overhead für das Wörterbuch selbst (einschließlich der Gemeinkosten der einzelnen Arrays).Andere Implementierungen und anderen Sammlungen haben andere Gemeinkosten. Sie können nicht einmal speichern
null
für einen null-Eintrag.null
kann hilfreich sein, der angibt, ein Wert wurde nicht geschrieben, in dem Fall einen besonderen Wert deutet auf einen tatsächlichen Wert vonnull
(besonders nützlich in den lock-free dictionary-Implementierungen, wo es nützlich sein kann, zu unterscheiden zwischen nicht nur ein unset und legen Sie Wert, aber zwischen einem unset -, set-und teilweise Wert).Alles, was Sie wirklich sagen ist, dass die Einstellung hinzufügen einen Wert von
null
A) nimmt etwas Speicher und B) nicht auf den Speicher, der mit einer nicht-null-Wert wäre aufgenommen, indem das Objekt selbst. Auch B) nicht wirklich halten, da, wenn, das Objekt wurde auch an anderer Stelle gespeichert, dann gibt es keine zusätzlichen Speicher Kosten, dass eine andere Referenz, die anderswo, außerhalb der auf sich selbst, wodurch die tatsächlichen Kosten der it die gleiche wie die Speicherungnull
.Ich denke ja, denn die null ist eine Referenz. Es ist Punkte zu nichts, aber Sie können Sie zu ersetzen, jedes mal mit einem realen Objekt-Referenz.
Also denke ich, dass zumindest 2x64bit zugewiesen sind, vielleicht das Wörterbuch braucht mehr Platz für sich.