2010-08-01 2 views
3

정적 클래스에 대한 진실을 알아 내려고하기 때문에 오랜 시간이 걸립니다. 내 요점은 : 값 유형은 스택에 할당되고, 힙의 참조 유형은 new 연산자를 사용할 때입니다. 하지만 정적 클래스의 속성은 인스턴스를 만들 수 없으며 값 유형이 아닌 것입니다. 그래서 언제 CLR이 정적 컨텐츠 용 메모리를 할당합니까? 언제쯤 ... 컴파일 중에 어셈블리가 만들어지면 나도 모르겠지만 확실하지는 않습니다. 그리고 어디서 ... 내가 JRichter의 "CLR via C#"을 읽으려고 시도하는 동안 그는 특정 클래스의 인스턴스를 만들 때 인스턴스 클래스의 정적 메서드가 힙에 할당된다는 것을 썼다. 클래스 (유형 객체 포인터 및 동기 블록 색인과 함께). 그러나 나는 그것을 얻지 않는다. 그것은 정적입니다. 그것은 어떤 대상의 상태에 의존해서는 안됩니다. 제발, 제발 날 비벼 줘.정적 클래스/멤버는 어디에서 할당합니까?

+1

정적 멤버와 생성자 (사용자가 인용 한 텍스트가 믿어지는)와 정적 클래스 간에는 차이가 있습니다. 이 구별을 알고 있습니까? 그렇다면 구체적으로 묻고있는 것은 무엇입니까? – strager

+0

음 ... 내가 아는 차이점은 메모리 할당에 있지 않습니까? 여기 정적 클래스의 메모리 할당에 대해 묻습니다. 저는 리히터의 책에 나오는 예문 때문에 정적 방법에 관해 말했습니다. 하지만 인스턴스 클래스의 정적 멤버와 정적 멤버의 할당간에 차이가 있다면이를 알고 싶습니다. – Mark

+1

값 유형이 * 항상 * 스택에 할당되어있는 것은 아닙니다. –

답변

1

사용자 힙 메모리뿐만 아니라 CLR은 다양한 부기 정보 &을 힙에 보관합니다. AppDomain에로드 된 모든 유형의 Type 객체 (이름 또는 오버로드, 추상 또는 봉인 여부, 그리고 정적 및 인스턴스 모두)에 정의 된 Type 객체는 물론 실행하는 메소드의 실제 코드가 여기에 포함됩니다. 유형.

메서드를 실행하면 CLR은 힙의 CLR 전용 부분에있는 해당 Type 개체의 메서드 정보를 조회하고 해당 메서드를 실행합니다. 인스턴스 메소드와 정적 메소드의 유일한 차이점은 인스턴스 메소드는 메소드가 실행중인 인스턴스를 가리키는 메소드 인수에 추가 'this'포인터를 포함한다는 것입니다.

정적 정보는 다른 모든 항목과 함께 힙에 저장되지만 특정 개체 인스턴스와 관련되지 않습니다.

+0

그래, 좋은 생각이야! 고맙습니다! 그래서이 모든 인스턴스와 정적 클래스는기만적인 것처럼 보입니다. 이것은 단지 여분의 "this"포인터 일 뿐이지 만, 같은 위치에 모든 것이 유지됩니다 ... 같은 방식입니다. 매우 감사합니다 – Mark

4

CLR은 AppDomain과 관련된 여러 힙 ("loader heaps")을 유지 관리합니다. 수집 가능한 객체를 포함하지 않기 때문에 가비지 수집 힙과 구분됩니다. 대부분 유형 관련 데이터입니다. AppDomain의 수명 동안 주변에있는 데이터의 종류.

정적 변수를위한 공간은 HighFrequencyHeap 중 하나에 할당됩니다. JIT 컴파일러는 할당을 수행하며, 생성 된 코드는 메모리 위치를 직접 참조합니다. 배경 정보는 MSDN Magazine article에 있습니다.

관련 문제