2013-09-16 8 views
9

Jeder weiß, dass in .NET Framework String-Objekte in Heap-Speicher direkt gespeichert sindString Constant Memory-Pool in C#

Ich versuche nur zu verstehen, wenn es einen reservierten Speicher in .NET Framework for Strings ist. In Java gibt es einen reservierten Speicher für Strings, die SCMP (String Constant Memory Pool) genannt werden, wobei Strings initialisiert und Müll gesammelt werden, genau wie andere Objekte im Heap-Speicher.

+1

Ich denke, Java eine solche Funktion hat, weil in den alten Tagen, wir mobile Geräte mit begrenztem Speicher hatte. Jetzt brauchen wir keine solche Funktion. Es ist viel einfacher für den Compiler und Garbage Collector. –

+0

Verwandte http://stackoverflow.com/questions/372547/where-do-java-and-net-string-literals-reside/372559#372559 –

Antwort

2

In .NET Literal-Strings sind "interniert", so dass es nur eine Kopie jeder Literal-Zeichenfolge gibt.

Siehe http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

+0

Diese Antwort ist irreführend. * Literal * Strings sind interniert. Dynamisch konstruierte Zeichenfolgen werden auf dem Heap als gewöhnliche Objekte zugewiesen und sind nicht notwendigerweise eindeutig. Schnell Beispiel: 'Object.ReferenceEquals ("abc", "ABC" .ToLowerInvariant())' wertet als 'false', da nur der erste String interniert wird. – Douglas

+0

@ Douglas - Keine Absicht zu täuschen. Die Antwort besagt, dass es eine Kopie jeder * literal * Zeichenfolge gibt. Die zitierte MSDN-Referenz macht sehr deutlich, dass programmatisch konstruierte Strings nicht interniert sind, es sei denn, man zwingt sie ausdrücklich dazu, mit der 'String.Intern'-Methode interniert zu werden. –

+1

Auch, nur weil ein String interniert wird, bedeutet nicht, dass der Saiten-Speicher in einem separat zugewiesenen Platz. Es gibt keinen Grund, dass es nicht nur im normalen Heapspeicher sein kann. Der Punkt ist, dass der Compiler den Überblick über all diese Saiten hält und gewährleistet die gleiche Referenz für alle Literale verwendet wird, sie nicht in einem separaten Speicherpool sein müssen, das zu tun. – Servy

5

Ich denke nicht, es so etwas in .net ist.

Stattdessen habe ich this und seine interessante lesen, wie Strings verwendet:

Die CLR eine Tabelle, die die intern Pool genannt behauptet, dass die Literalzeichenfolgen in einem Programm enthält. Dies stellt sicher, dass die wiederholte Verwendung der gleichen konstanten Strings in Ihrem Code die gleiche Zeichenfolge Referenz verwenden. Die System.String-Klasse stellt eine Intern-Methode bereit, die sicherstellt, dass eine Zeichenfolge im internen Pool ist, und den Verweis auf zurückgibt.

Überprüfen Sie auch diese MSDN: -

Wir zahlreiche Szenarien gesehen haben, wo der verwalteten Heap die gleiche Zeichenfolge wiederholt tausende Male enthält. Das Ergebnis ist ein großer funktionierender Satz, in dem viel Speicher von Strings verbraucht wird. In dieser Situation ist es oft besser string interning.

1

NET Framework Zeichenfolge zu verwenden Speicherung in einer Tabelle bewahrt, Intern Pool. Sie können sehen:

String interning and String.Empty - Eric Lippert

Wenn Sie zwei identische Zeichenkette in einer Übersetzungseinheit haben dann der Code, den wir erzeugen, stellt sicher, dass nur ein String-Objekt durch die CLR für alle Instanzen dieser wörtlich erstellt innerhalb der Versammlung. Diese Optimierung wird "String Interning" genannt.

String Interning .Net framework

der Common Language Runtime Kettenspeicher konserviert durch Aufrechterhalten einer Tabelle, genannt die intern Pool, die in eine einzelne Referenz enthält programm jede eindeutige Zeichenkette deklariert oder erstellt dein Programm. Folglich existiert eine Instanz einer Literal-Zeichenfolge mit einem bestimmten Wert nur einmal im System.