2013-09-16 11 views
9

Każdy wie, że w .NET framework obiekty String są bezpośrednio przechowywane w pamięci stertyString basen Constant pamięci w C#

jestem po prostu staramy się zrozumieć, jeśli istnieje jakakolwiek Reserved pamięci w .NET Framework dla pszczół. W języku Java istnieje zarezerwowana pamięć dla łańcuchów o nazwie SCMP (String Constant Memory Pool), w której łańcuchy są inicjowane, a śmieci są zbierane podobnie jak inne obiekty w pamięci sterty.

+1

Myślę, że Java ma taką funkcję, ponieważ w dawnych czasach mieliśmy urządzenia mobilne z ograniczoną pamięcią. Teraz nie potrzebujemy takiej funkcji. jest o wiele prostsze dla kompilatora i garbage collectora. –

+0

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

Odpowiedz

2

Łańcuchy literowe .NET są "internowane", więc istnieje tylko jedna kopia każdego ciągu literowego.

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

+0

Ta odpowiedź jest myląca. * Łańcuchy literalne * są internowane. Dynamicznie skonstruowane łańcuchy są przydzielane na stercie jako zwykłe obiekty i niekoniecznie są unikalne. Szybki przykład: 'Object.ReferenceEquals (" abc "," ABC ".ToLowerInvariant())' oznacza "fałsz", ponieważ internowany jest tylko pierwszy ciąg znaków. – Douglas

+0

@Douglas - Nie ma zamiaru wprowadzać w błąd. Odpowiedź brzmi, że istnieje jedna kopia każdego * literalnego * ciągu znaków. Cytowane odniesienie do MSDN wyraźnie pokazuje, że programowo skonstruowane ciągi nie są internowane, chyba że wyraźnie zmusisz je do internowania za pomocą metody 'String.Intern'. –

+1

Również dlatego, że łańcuch jest internowany, nie oznacza, że ​​pamięć łańcuchów znajduje się w osobnym miejscu. Nie ma powodu, dla którego nie może być zwykłą pamięcią sterty. Chodzi o to, że kompilator śledzi wszystkie te ciągi i zapewnia to samo odwołanie do wszystkich literałów, nie muszą one być w oddzielnej puli pamięci, aby to zrobić. – Servy

5

Nie sądzę, nie ma nic takiego w .NET.

Zamiast Czytałem this i jego ciekawe, jak wykorzystywane są ciągi:

CLR utrzymuje stół zwany basen intern zawierający dosłowne ciągi w programie. Gwarantuje to, że wielokrotne użycie stałych ciągów w kodzie będzie wykorzystywało ten sam ciąg znaków: . Klasa System.String udostępnia metodę Intern, która zapewnia, że ​​ciąg jest w puli intern i zwraca odwołanie do .

również sprawdzić ten MSDN: -

Widzieliśmy wiele scenariuszy, gdzie udało sterty zawiera sam ciąg powtarzanych tysiące razy. Rezultatem jest duży, działający zestaw, w którym duża część pamięci jest zużywana przez łańcuchy. W tym sytuacji, często lepiej jest użyć string interning.

1

.Net framework konserwuje przechowywania ciąg w tabeli, Intern Pool. można zobaczyć:

String interning and String.Empty - Eric Lippert

Jeśli masz dwie identyczne literały ciągów znaków w jednej jednostce kompilacji następnie kod generujemy zapewnia, że ​​tylko jeden obiekt ciąg jest tworzony przez CLR dla wszystkich instancji, że literalna w obrębie zespołu. Ta optymalizacja nazywana jest "interwencją ciągów".

String Interning .Net framework

Wspólna Language Runtime konserwuje przechowywanie ciąg utrzymując tabelę, zwany stażysta basen, który zawiera jedno odniesienie do każdy wyjątkowy ciągiem znaków Zadeklarowana lub utworzonego programowo w twój program. W związku z tym instancja ciągu literowego o konkretnej wartości istnieje tylko raz w systemie.