2017-01-16 3 views
4

동적 유형이 관련 유형보다 많은 메모리 크기를 사용하는지 여부C에서 동적 유형의 메모리 사용 #

예를 들어 필드는 4 바이트 만 사용합니까?

dynamic foo = (int) 1488; 
+0

기본 변수는 여전히 'int'이므로 예 값은 4 바이트입니다.그러나 프로그램을 동적으로 사용하기 위해 추가적인 오버 헤드가 발생합니다. –

+0

루트에서 '동적 인'은 다이내믹 타입처럼 동작하도록 멋진 Reflection을 사용하는 '객체'입니다. 실제로 나타내는 유형보다 더 많거나 적은 데이터를 차지하지 않습니다. – Abion47

+0

귀하의 답변은 여기에 있습니다. (첫 번째 예제에주의하십시오. 동적 유형과 객체 유형 모두 System.Int32 유형을 반환합니다.) https://msdn.microsoft.com/en-us/library/dd264741.aspx – Sparrow

답변

7

짧은 답변는 :

아니, 실제로는 32 비트 시스템에서 12 바이트 및 64 비트에서 24 바이트를 사용합니다. dynamic 유형이 dynamic 유형으로 무엇을해야하는지 이해하기 위해 더 많은 바이트를로드 컴파일러 대상으로하지만, 런타임에 저장됩니다

긴 대답. 그렇게하기 위해, 더 많은 메모리가이를 파악하는 데 사용될 것입니다. dynamic공상적인 개체로 생각하십시오.

-------------------------- -4 bytes 
| Object Header Word | 
|------------------------| +0 bytes 
| Method Table Pointer | 
|------------------------| +4 bytes for Method Table Pointer 

12 바이트의 합계가 가장 작은 참조 타입 이후에 할당해야 : 여기

class Mine 
{ 
} 

가 32 비트에 상기 목적을위한 오버 헤드 : 여기

는 클래스 32 비트에서 12 바이트입니다.

우리는 다음과 같이 그 클래스에 하나 개의 필드를 추가하는 경우 : 오버 헤드와 int 필드는 12 바이트에 들어갈 수 있기 때문에 여전히 12 바이트를 취할 것

class Mine 
{ 
    public int Field = 1488; 
} 

.

int 필드를 추가하면 16 바이트가 소요됩니다. 우리는이 같은 클래스에 하나 개 dynamic 필드를 추가하는 경우

그러나 :

class Mine 
{ 
    public dynamic Field = (int)1488; 
} 

하지는 12 바이트가 될 것입니다. 동적 필드는 object과 같이 처리되므로 크기는 12 + 12 = 24 바이트가됩니다. 심지어는 동적 비록 필드는 부울이기 때문에

class Mine 
{ 
    public dynamic Field = (bool)false; 
} 

Mine의 인스턴스는 여전히 24 바이트를 취할 것 그것은 여전히 ​​object처럼 취급 : 대신이 작업을 수행 할 경우 흥미로운 무엇

이다.

64 비트 시스템에서 동적 인 Mine의 인스턴스는 64 바이트의 최소 참조 유형이 24 바이트 (24 + 24 = 48 바이트)이므로 48 바이트를 차지합니다.

Here

당신이 인식하고 object의 크기 this 답을 볼 수 일부 개는 있습니다.