C#의 부울 변수는 메모리에 어떻게 저장됩니까? 즉, 바이트로 저장되고 다른 7 비트가 낭비 되는가, 아니면 배열의 경우 1 바이트 블록으로 그룹화됩니까?C#의 기본 부울 크기
이 질문에 대한 대답은 Java (Why is Java's boolean primitive size not defined?)입니다. Java와 C#은 이와 관련하여 동일한 것입니까?
C#의 부울 변수는 메모리에 어떻게 저장됩니까? 즉, 바이트로 저장되고 다른 7 비트가 낭비 되는가, 아니면 배열의 경우 1 바이트 블록으로 그룹화됩니까?C#의 기본 부울 크기
이 질문에 대한 대답은 Java (Why is Java's boolean primitive size not defined?)입니다. Java와 C#은 이와 관련하여 동일한 것입니까?
C#에서는 배열이나 필드에 1 바이트로 저장되지만 흥미롭게도 로컬 변수 일 때 4 바이트입니다. bool의 1- byteness는 Java와는 달리 .NET 문서의 어딘가에 정의되어 있다고 생각합니다. 로컬 변수에 대한 4 바이트 이유는 레지스터에서 32 비트를 readng 할 때 비트를 마스킹하지 않기 위해서라고 생각합니다. sizeof 연산자는 여전히 유일한 크기이기 때문에 1 바이트를 표시하며 그 밖의 모든 것은 구현 세부 사항입니다. C#으로
는 확실히 기본적으로 포장하지비트이므로 여러 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);
}
이 항목을 최적화하려고하는 것이시기 상조 일 수 있습니다. 부울 데이터의 방대한 양을 주로 다루지 않는 한, 메모리 문제의 원인이되지는 않습니다. –
그러나'Marshal.SizeOf'를'Foo'의 인스턴스와 함께 사용하면, 클래스 멤버 이건 Stilgar의 답인 것처럼 로컬 변수 이건 16을 반환합니다. – Andrew
@ 앤드류'마샬 (Marshal) '이 반환하는 것은 솔직하게는 크게 관련이 없다. 실제로 마샬링을 사용하지 않는 한. –
플로트? float 및 bool로 저장되며,이 경우 bool의 끝은 4 바이트까지 올라갑니다 (float?는 float의 경우 4 바이트 대 8 바이트를 차지함). 배열의 float와 쌍을 이루기 때문에이 경우 4 바이트로 정렬됩니다. – John
@ 존, 어떻게 플로트 크기를 측정 했습니까? 'sizeof'를 사용할 수없고 Marshal.SizeOf'가 4를 반환합니다. – Andrew
float [?]와 float []을 만들었습니다. 각 단계 전후에 GC.GetTotalMemory()를 호출했습니다. GetTotalMemory 호출 전에 GC.Collect()를 두 번 호출하면 데이터 요소 자체의 크기가 아닌 정렬을 포함하여 할당에 의해 소비 된 실제 메모리 양을 알 수 있습니다. – John