2010-03-29 2 views
2

Java에서 byte 또는 short은 JVM의 '자연어'단어 길이, 즉 대부분 32 비트로 저장됩니다. 예외는 바이트 배열로, 각 바이트는 1 바이트의 메모리를 차지합니다.CLR은 '자연적인'크기의 위치에 작은 값을 저장합니까?

CLR이 동일한 기능을 수행합니까?

의 경우이 경우 어떤 경우에 예외가 있습니까? 예 : 얼마나 많은 메모리가 차지합니까?

struct MyStruct 
{ 
    short s1; 
    short s2; 
} 

답변

3
가 정말이 목적을위한 것 아니에요 있지만

, 그리고 (이보기의 마샬링 점보기가 아닌 CLR 내부 구조 지점에서 것들에 대해 생각하고 있기 때문에) 시간이 약간 다른 답변을 제공에서, Marhsal.SizeOf을 줄 수 있습니다 답 : (반바지는 반바지로 저장되는 IE)이 경우

System.Runtime.InteropServices.Marshal.SizeOf(typeof(MyStruct)) 

, 그것은 4 응답합니다. 이는 구현 세부 사항이므로 오늘의 답을 어떤 목적으로도 신뢰해서는 안됩니다.

+0

Marshal.SizeOf (typeof (int))가하는 일이 궁금합니다. – izb

+0

레이아웃은 특히 마샬링을 위해 'StructLayout'을 사용하여 수정할 수 있습니다. – OregonGhost

1

CLR은 어느 정도 동일한 크기의 팩 멤버를 수행합니다. 그것은 배열을 팩 않습니다, 그리고 귀하의 예제 구조를 모든 플랫폼에서 4 바이트를 차지할 것으로 기대합니다.

정확히 어떤 유형이 압축되고 CLR 구현 및 현재 플랫폼에 따라 달라집니다. 규칙은 엄격하게 정의되지 않으므로 CLR은 구성원을 가장 효율적으로 저장하기 위해 재정렬 할 자유가 있습니다.

2

실제로 클래스 및 구조의 메모리 레이아웃을 할당하는 것은 JIT 컴파일러의 작업입니다. 실제 레이아웃은 어떤 방식으로도 (생성 된 머신 코드를 보지 않고) 발견 할 수 없으며 객체를 알려진 레이아웃으로 마샬링하는 데 [StructLayout] 속성이 필요합니다. JIT는 정렬을 유지하고 할당 크기를 최소화하기 위해 필드 순서를 변경하여이 기능을 활용합니다.

인용 한 구조체에는 놀랄만 한 일이 없을 것이며, 관리되는 코드를 실행할 수있는 현재 CPU 아키텍처에서 필드가 이미 정렬되어 있습니다. 값 유형의 크기는 CLI에 의해 보장되며, 짧은 값은 항상 16 비트입니다. 구조는 32 비트를 차지합니다.

+0

+1은 StructLayout을 언급하는데, 이것은 interop (정확한 레이아웃을 지정하기 위해 * 필요한 * 위치)를 수행하려는 경우 가장 중요한 단일 항목입니다. – OregonGhost

관련 문제