2010-02-22 3 views

답변

14

C#에서는 배열이나 필드에 1 바이트로 저장되지만 흥미롭게도 로컬 변수 일 때 4 바이트입니다. bool의 1- byteness는 Java와는 달리 .NET 문서의 어딘가에 정의되어 있다고 생각합니다. 로컬 변수에 대한 4 바이트 이유는 레지스터에서 32 비트를 readng 할 때 비트를 마스킹하지 않기 위해서라고 생각합니다. sizeof 연산자는 여전히 유일한 크기이기 때문에 1 바이트를 표시하며 그 밖의 모든 것은 구현 세부 사항입니다. C#으로

+0

플로트? float 및 bool로 저장되며,이 경우 bool의 끝은 4 바이트까지 올라갑니다 (float?는 float의 경우 4 바이트 대 8 바이트를 차지함). 배열의 float와 쌍을 이루기 때문에이 경우 4 바이트로 정렬됩니다. – John

+0

@ 존, 어떻게 플로트 크기를 측정 했습니까? 'sizeof'를 사용할 수없고 Marshal.SizeOf'가 4를 반환합니다. – Andrew

+0

float [?]와 float []을 만들었습니다. 각 단계 전후에 GC.GetTotalMemory()를 호출했습니다. GetTotalMemory 호출 전에 GC.Collect()를 두 번 호출하면 데이터 요소 자체의 크기가 아닌 정렬을 포함하여 할당에 의해 소비 된 실제 메모리 양을 알 수 있습니다. – John

24

는 확실히 기본적으로 포장하지비트이므로 여러 BOOL 필드는 각각 1 바이트 걸릴. BitVector32, BitArray 또는 단순히 비트 연산을 사용하여이 오버 헤드를 줄일 수 있습니다. 변수 나는 4 바이트를 취한다 (본질적으로 int = Int32)라고 생각한다. 예를 들어

다음 세트 i 4 :

struct Foo 
{ 
    public bool A, B, C, D; 
} 
static unsafe void Main() 
{ 
    int i = sizeof(Foo); 
} 
+6

이 항목을 최적화하려고하는 것이시기 상조 일 수 있습니다. 부울 데이터의 방대한 양을 주로 다루지 않는 한, 메모리 문제의 원인이되지는 않습니다. –

+0

그러나'Marshal.SizeOf'를'Foo'의 인스턴스와 함께 사용하면, 클래스 멤버 이건 Stilgar의 답인 것처럼 로컬 변수 이건 16을 반환합니다. – Andrew

+1

@ 앤드류'마샬 (Marshal) '이 반환하는 것은 솔직하게는 크게 관련이 없다. 실제로 마샬링을 사용하지 않는 한. –

관련 문제