2011-03-21 2 views
0

값 유형은 system.object에서 파생됩니다. 왜 객체 파생 클래스는 valuetype 구조보다 더 많은 공간을 차지합니까? 미리 감사드립니다.왜 valutype은 .NET에서 객체 유형보다 적은 공간을 차지합니까?

+1

'valuetype은 system.object.에서 파생된다고합니다. '- 나는 이것이 어디에서 말한 것인지 궁금하며, 이것을 주장하는 소스를 찾으면 학습 자료로 피하는 것이 좋습니다. –

+3

@Darin - 'ValueType'은 System.Object에서 파생됩니다. http://msdn.microsoft.com/en-us/library/system.valuetype(v=VS.100).aspx. 그러나 파생 된 형식은 CLR 및 컴파일러에서 특별한 방식으로 처리되므로 확실하게 작동하지는 않습니다. 그러나 참조 자료에 따르면 개체가 모든 개체의 기반이된다고 가정 할 때 포스터의 혼란 (권투 복잡한 주제입니다.) –

+0

@ 다린은 당신에게 그 반대의 주장을하고 있습니까? 나는'ValueType'이 기술적으로'Object'에서 파생 된 것으로 생각했고 그것은 참조 유형 그 자체입니다. 물론 임의의 구체적인 valuetype을 'ValueType'또는 'Object'로 변환하는 것은 복싱 변환입니다. – CodesInChaos

답변

4

모든 개체에는 개체 헤더가 있습니다. 이것은 32 비트 머신에서 8 바이트, 싱크 블록에서 4 바이트, 타입 핸들에서 4 바이트입니다. 값 형식 값은 System.Object가 boxed 될 때 파생됩니다. 상자가없는 경우는 int, 상자가없는 경우는 4 바이트, 헤더의 경우는 +8 바이트입니다.

this answer을 확인하면 박스형 값 유형이 어떻게 생겼는지 더 자세히 알 수 있습니다.

+0

+1, 훌륭한 설명. –

+0

값 유형 * 항상 *는 Object에서 파생되며 값 유형이 객체로 변환하지 않으면 객체 내부에만 저장됩니다. boxed int는 32 비트 시스템에서 boxed 될 때 16 바이트를 사용하고 64 비트 시스템에서는 20 바이트를 사용합니다. – Guffa

+0

@Guffa - 링크 된 답변을 사용하여 이것이 올바르지 않은 것을 볼 수 있습니다. 두 개의 객체를 만듭니다. –

0

값 유형은 컴파일러에서 다르게 처리되기 때문에. 그들은 Object에서 상속 받았지만 객체로 저장되지 않습니다.

오브젝트는 두 개의 포인터 (32 비트 시스템에서는 8 바이트, 64 비트 시스템에서는 16 바이트)의 추가 오버 헤드로 힙에 저장됩니다. 값 유형은 객체의 일부로 또는 메소드 호출의 스택 프레임에 인라인으로 저장되며 추가 오버 헤드가 없습니다.

0

ValueType을 상속 한 값 형식과 Object를 통해 상속되는 값 형식과 관련하여 대부분의 경우 약간의 거짓말이 있습니다. 박스 화되지 않은 int 또는 bool에는 상속과 관련된 아무 것도 저장되어 있지 않습니다. 그러나 박스가있는 경우이 값을 얻습니다 (일부 작업에서는 암시 적으로 발생합니다). 대부분의 언어는 이것을 숨겨서, 우리가 Object를 사용할 때마다 Object에서 파생되는 다른 객체와 동일하게 보이지만, 우리는 그것들을 사용할 때도 단순한 타입으로 동작합니다.

관련 문제