2013-09-16 6 views
9

모두가 닷넷 프레임 워크 String 오브젝트가 직접 난 그냥 문자열을위한 닷넷 프레임 워크의 모든 예약 된 메모리가 있는지 이해하려고 노력하고 힙 메모리문자열 상수 메모리 풀은

에 저장되어있는 것을 알고있다. 자바에서는 문자열이 초기화되고 힙 메모리의 다른 객체처럼 가비지 수집되는 SCMP (String Constant Memory Pool)라는 문자열에 예약 된 메모리가 있습니다.

+1

예전에는 메모리가 제한적인 모바일 장치가 있었기 때문에 자바는 그러한 기능을 가지고 있다고 생각합니다. 이제는 그런 기능이 필요 없습니다. 컴파일러와 가비지 수집기는 훨씬 간단합니다. –

+0

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

답변

2

.NET에서 리터럴 문자열은 각 리터럴 문자열의 복사본이 하나만 있도록 "interned"입니다.

내가 닷넷에서 그런 거기에 아무것도 생각하지 말아

+0

이 답변은 오해의 소지가 있습니다. * Literal * 문자열은 금지됩니다. 동적으로 생성 된 문자열은 힙에 일반 객체로 할당되며 반드시 고유하지는 않습니다. 빠른 예 :'Object.ReferenceEquals ("abc", "ABC".ToLowerInvariant())는 첫 번째 문자열 만 인턴되기 때문에'false'로 평가됩니다. – Douglas

+0

@Douglas - 오도 된 의도는 없습니다. 대답은 각각의 * 리터럴 * 문자열 하나가 있다는 것입니다. 인용 된 MSDN 참고 자료에서는 프로그래밍 방식으로 생성 된 문자열이 'String.Intern'메서드를 사용하여 인턴 된 것이 확실한 경우가 아니라면 인자기되지 않은 문자열을 명시하고 있습니다. –

+1

또한 문자열이 인턴되기 때문에 문자열 메모리가 별도로 할당 된 위치에 있음을 의미하지는 않습니다. 규칙적으로 힙 메모리에있을 이유가 없습니다. 요점은 컴파일러가 모든 문자열을 추적하고 모든 리터럴에 대해 동일한 참조가 사용되도록 보장하기 때문에 별도의 메모리 풀에있을 필요가 없습니다. – Servy

5

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx를 참조하십시오. CLR을 테이블은 프로그램에서 리터럴 문자열을 포함하는 인턴 풀라고 유지

:

는 대신에 나는 this 및 문자열을 사용하는 방법의 흥미를 읽었습니다. 이렇게하면 코드에서 동일한 상수 문자열을 반복적으로 사용하면 동일한 문자열 참조가 사용됩니다. System.String 클래스는 문자열이 인턴 풀에 있음을 보장하고 이라는 참조를 반환하는 Intern 메서드를 제공합니다.

또한 확인이 MSDN : -

우리는 관리 힙이 시대의 동일한 문자열 반복 수천을 포함 다수의 시나리오를 본

. 그 결과 많은 양의 메모리가 문자열에 의해 소비되는 큰 작업 이 설정됩니다. 이 상황에서, string interning.

1

닷넷 프레임 워크 테이블, Intern Pool에 문자열 저장 공간을 절약 사용하는 것이 좋습니다. 당신은 볼 수 있습니다 : 당신이 하나 개의 컴파일 단위에서 두 개의 동일한 문자열 리터럴이있는 경우

String interning and String.Empty - Eric Lippert

는 우리가 생성하는 코드는 하나의 문자열 객체가 하여 해당 문자의 모든 인스턴스의 CLR을 만들어 보장 어셈블리 내에서. 이 최적화는 "string interning"이라고합니다.

String Interning .Net framework

런타임 테이블을 유지하여 문자열 저장을 보존 공통 언어는 각각의 고유 한 리터럴 문자열 선언 또는 에서 프로그래밍 방식으로 만든 에 하나의 참조를 포함하는 인턴 풀라고 귀하의 프로그램. 결과적으로 특정 값을 갖는 리터럴 문자열의 인스턴스는 시스템에 한 번만 존재합니다.