정적 클래스에 대한 진실을 알아 내려고하기 때문에 오랜 시간이 걸립니다. 내 요점은 : 값 유형은 스택에 할당되고, 힙의 참조 유형은 new 연산자를 사용할 때입니다. 하지만 정적 클래스의 속성은 인스턴스를 만들 수 없으며 값 유형이 아닌 것입니다. 그래서 언제 CLR이 정적 컨텐츠 용 메모리를 할당합니까? 언제쯤 ... 컴파일 중에 어셈블리가 만들어지면 나도 모르겠지만 확실하지는 않습니다. 그리고 어디서 ... 내가 JRichter의 "CLR via C#"을 읽으려고 시도하는 동안 그는 특정 클래스의 인스턴스를 만들 때 인스턴스 클래스의 정적 메서드가 힙에 할당된다는 것을 썼다. 클래스 (유형 객체 포인터 및 동기 블록 색인과 함께). 그러나 나는 그것을 얻지 않는다. 그것은 정적입니다. 그것은 어떤 대상의 상태에 의존해서는 안됩니다. 제발, 제발 날 비벼 줘.정적 클래스/멤버는 어디에서 할당합니까?
답변
사용자 힙 메모리뿐만 아니라 CLR은 다양한 부기 정보 &을 힙에 보관합니다. AppDomain에로드 된 모든 유형의 Type 객체 (이름 또는 오버로드, 추상 또는 봉인 여부, 그리고 정적 및 인스턴스 모두)에 정의 된 Type 객체는 물론 실행하는 메소드의 실제 코드가 여기에 포함됩니다. 유형.
메서드를 실행하면 CLR은 힙의 CLR 전용 부분에있는 해당 Type 개체의 메서드 정보를 조회하고 해당 메서드를 실행합니다. 인스턴스 메소드와 정적 메소드의 유일한 차이점은 인스턴스 메소드는 메소드가 실행중인 인스턴스를 가리키는 메소드 인수에 추가 'this'포인터를 포함한다는 것입니다.
정적 정보는 다른 모든 항목과 함께 힙에 저장되지만 특정 개체 인스턴스와 관련되지 않습니다.
그래, 좋은 생각이야! 고맙습니다! 그래서이 모든 인스턴스와 정적 클래스는기만적인 것처럼 보입니다. 이것은 단지 여분의 "this"포인터 일 뿐이지 만, 같은 위치에 모든 것이 유지됩니다 ... 같은 방식입니다. 매우 감사합니다 – Mark
CLR은 AppDomain과 관련된 여러 힙 ("loader heaps")을 유지 관리합니다. 수집 가능한 객체를 포함하지 않기 때문에 가비지 수집 힙과 구분됩니다. 대부분 유형 관련 데이터입니다. AppDomain의 수명 동안 주변에있는 데이터의 종류.
정적 변수를위한 공간은 HighFrequencyHeap 중 하나에 할당됩니다. JIT 컴파일러는 할당을 수행하며, 생성 된 코드는 메모리 위치를 직접 참조합니다. 배경 정보는 MSDN Magazine article에 있습니다.
- 1. 잠금을 할당합니까
- 2. Java : 정적 필드는 메모리 내 어디에서 살고 있습니까?
- 3. 정적 변수는 ASP.NET 페이지에서 어디에서 작동합니까?
- 4. 목표 C - 전역 정적 변수는 어디에서 dealloc합니까?
- 5. retain은 RAM에 메모리를 할당합니까?
- 6. 사전에 함수를 어떻게 할당합니까?
- 7. NSString 누출을 재 할당합니까?
- 8. 문자열에 SqlDbType.UniqueIdentifier를 어떻게 할당합니까?
- 9. malloc은 4 비트 만 할당합니까?
- 10. UIButton에 UIBarButtonSystemItemAction 아이콘을 어떻게 할당합니까?
- 11. JavaScript 'onclick'속성을 어떻게 동적으로 할당합니까?
- 12. 어떻게 연속 디스크 공간을 할당합니까?
- 13. qml의 int에 TextInput을 어떻게 할당합니까?
- 14. Java VM은 어떻게 메모리를 할당합니까?
- 15. 어디에서 재사용 된 정적 문자열 상수를 Flex 어플리케이션에 저장해야합니까?
- 16. 아이폰 호환 정적 라이브러리가있는 javascriptcore 버전은 어디에서 찾을 수 있습니까?
- 17. concrete5에서 정적 정적 탐색 구현
- 18. JSP, 호스트 모드의 정적 변수, 정적 변수
- 19. C는 어떻게 다차원 배열에 데이터 항목을 할당합니까?
- 20. 작은 문자열에 대해 스택에 문자열 클래스를 할당합니까?
- 21. 배열 요소를 같은 이름의 변수에 할당합니까?
- 22. RGB 색상 코드를 WORD에 어떻게 할당합니까?
- 23. 어떻게 MojoX :: Redis 결과를 변수에 할당합니까?
- 24. malloc은 0에서 양의 무한대까지 메모리를 할당합니까?
- 25. sh -c "..."명령에서 쉘 변수를 어떻게 할당합니까?
- 26. 얼마나 많은 메모리를 UIImageView 320x480에 할당합니까?
- 27. 자바 가상 머신 - 리소스를 어떻게 할당합니까?
- 28. 속성에 와일드 카드 경로를 어떻게 할당합니까?
- 29. jquery ui datepicker에 어떻게 날짜를 할당합니까?
- 30. C++ new/new [], 어떻게 메모리를 할당합니까?
정적 멤버와 생성자 (사용자가 인용 한 텍스트가 믿어지는)와 정적 클래스 간에는 차이가 있습니다. 이 구별을 알고 있습니까? 그렇다면 구체적으로 묻고있는 것은 무엇입니까? – strager
음 ... 내가 아는 차이점은 메모리 할당에 있지 않습니까? 여기 정적 클래스의 메모리 할당에 대해 묻습니다. 저는 리히터의 책에 나오는 예문 때문에 정적 방법에 관해 말했습니다. 하지만 인스턴스 클래스의 정적 멤버와 정적 멤버의 할당간에 차이가 있다면이를 알고 싶습니다. – Mark
값 유형이 * 항상 * 스택에 할당되어있는 것은 아닙니다. –