2009-08-24 6 views
4

C# (.NET)에서 메서드 (가상, 정적, 비 가상)가 클래스 크기에 어떻게 영향을 줍니까?C# 클래스 크기 계산

+0

어셈블리의 컴파일 된 클래스, 클래스 또는 메모리의 클래스 인스턴스 크기를 포함하는 소스 코드 파일을 의미합니까? –

+0

인스턴스의 크기를 의미합니다. 크기를 계산할 때 sizeof() 변수를 사용할 수 없습니다 (컴파일러 오류). 'MyClass'에 미리 정의 된 크기가 없으므로 sizeof를 안전하지 않은 컨텍스트에서만 사용할 수 있습니다. System.Runtime.InteropServices.Marshal을 사용하십시오. SizeOf) Marshal.SizeOf()는 런타임에 같은 오류를 발생시킵니다. StructLayoutAttribute를 클래스 선언에 적용하면 sizeof()는 1을 반환합니다. –

답변

7

각 메소드는 바이트 코드를 보유하기 위해 메모리를 사용합니다. 코드는 각 방법에 대해 한 번만 존재하며 각 인스턴스에 대해 한 번씩 존재하지는 않습니다.

인스턴스 메소드 (가상 또는 비 가상)를 추가하고 제거해도 할당 된 객체의 크기는 변경되지 않습니다. 이것은 가상 메소드를 추가 할 때 때때로 할당 된 객체의 크기가 증가하는 C++와는 다릅니다. C++과 마찬가지로 정적 메서드는 할당 된 객체의 크기를 변경하지 않습니다.

¹ 제네릭 메서드의 경우 인스턴스화 된 각 유형 집합에 대해 하나의 복사본이 있습니다.

편집 : 댓글에 대한 응답으로, 나는 더 자세히 설명 할 것이다.

@ 리차드 : 사실 일 수도 있고 아닐 수도 있습니다 (변경 될 수도 있음). 일리노이 바이트 코드의 사본 하나만 필요합니다. 하나의 메소드 설명자 블록은 개방형 생성 메소드 및 닫혀있는 생성 메소드에 필요하고 일반 유형 매개 변수 (일반 유형 정의의 일반 매개 변수화 된 기본 유형에 일반 인수가있는 메소드)를 여전히 포함하는 생성 된 인스턴스에 대한 설명자를 필요로합니다. 일반적으로 네이티브 코드의 복사본은 0 또는 더 많은 참조 유형에 대해 하나의 값 형식과 하나의 닫힌 생성 된 인스턴스에 대해 유지되지만 0 (JIT되지 않음/방금 해석 된 값) 또는 두 개 이상 (기본 및 최적화 컴파일러. 최적화 된 JIT로 다시 컴파일 된 이후 하나 이상의 호출 스택이 기준 버전을 벗어나지 않은 경우). 다시 편집 : 제네릭 매개 변수 제약 조건은 인스턴스화 된 모든 참조 형식에 대해 네이티브 코드 복사본 하나만 허용한다는 점에서 옳습니다.

+0

고마워, 그게 내가 원하는거야. 공식적인 참고 문헌을 줄 수 있습니까? –

+2

단일 유형 매개 변수가있는 일반 메소드의 경우 일반 유형이 인스턴스화 된 각 값 유형에 대해 하나의 사본이 존재하며 모든 참조 유형에 대해 한 번 (참조 유형에 대해 인스턴스화되지 않은 경우 0) 사본이 존재합니다. 여러 유형 매개 변수의 각 조합을 확장하십시오 ... – Richard

+0

나는 그가 전체 크기가 아닌 인스턴스 크기를 요구한다고 생각합니다. –

1

인스턴스 당 크기는 메서드가 아닌 클래스의 필드에 따라 다릅니다. 구현 세부 사항에 따라 인터페이스 구현시 인스턴스의 공간 (인터페이스 당 포인터 크기의 슬롯 하나)을 차지할 수도 있지만이를 보장 할 수는 없습니다.

향후 변경 될 수 있으므로 구현 정의 동작에 대한 "공식 참조"를 찾는 것은 어려울 것입니다.