값 유형은 system.object에서 파생됩니다. 왜 객체 파생 클래스는 valuetype 구조보다 더 많은 공간을 차지합니까? 미리 감사드립니다.왜 valutype은 .NET에서 객체 유형보다 적은 공간을 차지합니까?
답변
모든 개체에는 개체 헤더가 있습니다. 이것은 32 비트 머신에서 8 바이트, 싱크 블록에서 4 바이트, 타입 핸들에서 4 바이트입니다. 값 형식 값은 System.Object가 boxed 될 때 파생됩니다. 상자가없는 경우는 int, 상자가없는 경우는 4 바이트, 헤더의 경우는 +8 바이트입니다.
this answer을 확인하면 박스형 값 유형이 어떻게 생겼는지 더 자세히 알 수 있습니다.
+1, 훌륭한 설명. –
값 유형 * 항상 *는 Object에서 파생되며 값 유형이 객체로 변환하지 않으면 객체 내부에만 저장됩니다. boxed int는 32 비트 시스템에서 boxed 될 때 16 바이트를 사용하고 64 비트 시스템에서는 20 바이트를 사용합니다. – Guffa
@Guffa - 링크 된 답변을 사용하여 이것이 올바르지 않은 것을 볼 수 있습니다. 두 개의 객체를 만듭니다. –
값 유형은 컴파일러에서 다르게 처리되기 때문에. 그들은 Object
에서 상속 받았지만 객체로 저장되지 않습니다.
오브젝트는 두 개의 포인터 (32 비트 시스템에서는 8 바이트, 64 비트 시스템에서는 16 바이트)의 추가 오버 헤드로 힙에 저장됩니다. 값 유형은 객체의 일부로 또는 메소드 호출의 스택 프레임에 인라인으로 저장되며 추가 오버 헤드가 없습니다.
ValueType을 상속 한 값 형식과 Object를 통해 상속되는 값 형식과 관련하여 대부분의 경우 약간의 거짓말이 있습니다. 박스 화되지 않은 int 또는 bool에는 상속과 관련된 아무 것도 저장되어 있지 않습니다. 그러나 박스가있는 경우이 값을 얻습니다 (일부 작업에서는 암시 적으로 발생합니다). 대부분의 언어는 이것을 숨겨서, 우리가 Object를 사용할 때마다 Object에서 파생되는 다른 객체와 동일하게 보이지만, 우리는 그것들을 사용할 때도 단순한 타입으로 동작합니다.
- 1. postgresql 인덱스에서 NULLs가 공간을 차지합니까?
- 2. 데이터 세트의 "null"값이 공간을 차지합니까?
- 3. 이동 된 div가 여전히 원래 공간을 차지합니까?
- 4. 64 비트 시스템에서 32 비트 변수는 64 비트 객체보다 적은 공간을 차지합니까?
- 5. 가능한 한 적은 공간을 차지할 사각형 스태킹
- 6. 왜 객체가 32가 아닌 64 바이트를 차지합니까?
- 7. 모든 글꼴이 동일한 값을 가진 브라우저에서 동일한 공간을 차지합니까?
- 8. 변수가 직렬화 될 때와 같은 메모리 공간을 차지합니까?
- 9. Interop에서 포인터를 사용하여 구조체를 반환하는 경우 많은 메모리 공간을 차지합니까?
- 10. 왜 스레드가 힙 공간을 공유합니까?
- 11. LaTeX는 마침표 뒤에 너무 많이 또는 너무 적은 공간을 넣습니다.
- 12. 왜 autovacuum 프로세스가 메모리와 스왑 메모리를 많이 차지합니까?
- 13. 왜 글로벌 $ _SERVER 어레이가 13 배의 메모리를 차지합니까?
- 14. (왜) 리플렉션이 .NET에서 너무 비쌉니까?
- 15. 왜 새 객체()가 NULL입니까?
- 16. 자바, 불가능한 캐스트 객체 ..... 왜?
- 17. .net에서 객체 생성 과정에서 후크를 추가하는 방법
- 18. .Net에서 다중 인터페이스 및 객체 인스턴스 구현
- 19. C#/NET에서 인수가없는 생성자가없는 객체 조롱
- 20. 왜 Linq Where 절은 적은 양이 아닌 많은 결과를 산출합니까?
- 21. HTTP 데이터가 여러 패킷을 차지합니까?
- 22. 테이블 슬라이스가 R에서 메모리를 차지합니까?
- 23. AWK 스크립트가 많은 CPU를 차지합니까?
- 24. .net에서 선호하는 구성 방법은 무엇입니까? 왜?
- 25. 왜 .NET에서 Thread.Name을 변경할 수 없습니까?
- 26. .net에서 왜 계산적으로 무거운 예외가 발생하나요?
- 27. .NET에서 왜 CPU를 많이 사용하는 이유는 무엇입니까?
- 28. Java의 Grizzly가 버퍼 용 메모리를 많이 차지합니까?
- 29. Flex3 - 액션 스크립트 : 객체 배열의 빈 공간을 캡처하는 방법
- 30. Dreaded 객체 힙을위한 충분한 공간을 확보 할 수 없습니다.
'valuetype은 system.object.에서 파생된다고합니다. '- 나는 이것이 어디에서 말한 것인지 궁금하며, 이것을 주장하는 소스를 찾으면 학습 자료로 피하는 것이 좋습니다. –
@Darin - 'ValueType'은 System.Object에서 파생됩니다. http://msdn.microsoft.com/en-us/library/system.valuetype(v=VS.100).aspx. 그러나 파생 된 형식은 CLR 및 컴파일러에서 특별한 방식으로 처리되므로 확실하게 작동하지는 않습니다. 그러나 참조 자료에 따르면 개체가 모든 개체의 기반이된다고 가정 할 때 포스터의 혼란 (권투 복잡한 주제입니다.) –
@ 다린은 당신에게 그 반대의 주장을하고 있습니까? 나는'ValueType'이 기술적으로'Object'에서 파생 된 것으로 생각했고 그것은 참조 유형 그 자체입니다. 물론 임의의 구체적인 valuetype을 'ValueType'또는 'Object'로 변환하는 것은 복싱 변환입니다. – CodesInChaos