문제

.NET 프레임워크에서 부울은 4바이트, 문자는 2바이트를 소비하는 이유는 무엇입니까?부울은 1비트를 차지하거나 최소한 문자보다 작아야 합니다.

도움이 되었습니까?

해결책

메모리 정렬 문제입니다. 4 바이트 변수는 2 바이트보다 빠르게 작동합니다. 이것이 바이트 대신 int를 사용해야하는 이유입니다.

메모리가 속도보다 더 큰 관심사 일 때만 2 바이트 변수를 사용해야합니다. 그리고 이것이 Char (.NET의 유니 코드)가 4 대신 2 바이트를 가져가는 이유입니다.

다른 팁

에 대한 boolean

대부분의 다른 답변은 잘못된 것입니다. 정렬과 속도는 프로그래머가 루프 카운터를 위해 int를 고수 해야하는 이유입니다. 컴파일러가 바이트를 4 바이트 너비로 만드는 이유가 아닙니다. 실제로 모든 추론은 부울뿐만 아니라 바이트와 짧은에 적용됩니다.

C#에서 적어도 Bool (또는 System.Boolean)은 1 바이트 너비의 내장 구조로 자동 상자에 걸릴 수 있으므로 객체가 있습니다 (최소한 두 개의 메모리 단어가 필요합니다. 최소한 8/. 필드 (적어도 하나의 바이트)와 하나의 메모리 단어를 가리키는 32/64 비트 환경에서 16 바이트, 즉 총 13/25 바이트가 있습니다.

이것이 실제로 "C# Primitive 유형"의 첫 번째 Google 항목입니다.http://msdn.microsoft.com/en-us/library/ms228360(vs.80).aspx

또한 인용 된 링크 (http://geekswithblogs.net/cwilliams/archive/2005/09/18/54271.aspx) 또한 CLI 표준에 의해 부울은 1 바이트를 차지한다고 말합니다.

그러나 실제로, 이것이 보이는 유일한 곳은 부울의 배열에 있습니다. 다른 경우, 한 부울은 4 바이트를 취할 수 있습니다.

  • 구조 내에서 대부분의 runtimes (Java)는 모든 필드를 성능을 위해 4 바이트 경계로 정렬합니다. 임베디드 장치 용 Monty JVM은 더 현명합니다. 필드를 최적으로 재정의하는 것 같습니다.
    • 통역사의 로컬 프레임/오페라 스택에서 대부분의 구현에서 성능을 위해 하나의 스택 항목은 하나의 메모리 단어와 넓습니다. Java에서 2 대신 1 개의 스택 항목 만 사용합니다). JIT 컴파일러는 부울 지역 주민에게 1 바이트를 사용할 수 있으며 추가 오버 헤드가 가치가있는 경우 성능 영향없이 필드를 재정렬하여 다른 VAR을 정렬 할 수 있습니다.

에 대한 char

char 국제화 지원이 필요할 때 2 바이트 문자를 내부적으로 사용하는 것이 가장 안전한 베팅이기 때문에 두 바이트입니다. 이는 유니 코드를 지원하기로 직접적으로 관련이 아니라 UTF-16 및 기본 다국어 평면을 고수하기로 선택합니다. Java와 C#에서는 하나의 논리적 숯이 유형 숯의 변수에 적합하다고 가정 할 수 있습니다.

32비트 환경에서는 CPU가 8비트나 16비트 값보다 32비트 값을 더 빠르게 처리할 수 있기 때문에 이는 속도/크기 상충 관계입니다.메모리를 절약해야 하고 많은 양의 bool이 있는 경우 다음을 사용하십시오. 단위s를 입력하고 부울을 4바이트 비트로 저장합니다. 단위에스.Char는 16비트 유니코드 문자를 저장하므로 너비가 2바이트입니다.

메모리 저장의 사소한 차이에 관계없이, true/false 예/아니오 값에 부울을 사용하는 것은 개발자에게 중요합니다 (1 년 후에 코드를 다시 방문해야 할 때 자신을 포함하여). 코드를 더 이해하기 쉽게 만드는 것이 두 바이트를 저장하는 것보다 훨씬 중요합니다.

코드를보다 정확하게 반영하게하면 일부 컴파일러 최적화가 부정적인 영향을 미칠 가능성이 줄어 듭니다. 이 조언은 플랫폼과 컴파일러를 초월합니다.

또한 부울을 사용하여 Maintanable 코드를 작성해야합니다. 내가 코드를 보면서 무언가가 부울이라는 것을보고, 당신의 char를 부울로 사용한다는 것을 알아 내기 위해 메모리 절약의 가치가 있습니다.

"실제로 부울은 4 바이트입니다. 트레이드 오프는 일반적으로 그만한 가치가 있습니다. 비트 벡터 클래스를 사용해야합니다.

Paul Wick이 작성했습니다 http://geekswithblogs.net/cwilliams/archive/2005/09/18/54271.aspx

우선 프로파일 러를 사용하여 메모리 문제가있는 위치를 결정해야합니다. IMHO.

메모리는 큰 비트가 큰 경우에만 관심이 있습니다.이 경우 System.collections.bitarray 클래스를 사용할 수 있습니다.

Windows와 .NET이 사용했기 때문입니다 유니 코드 (UTF 16) 내부 캐릭터 세트로 시작된 이후. UTF 16 문자 당 2 바이트 또는 문자 당 2 바이트 단어 쌍을 사용하지만 필요한 경우에만 가변 너비 인코딩.

"기본 다국어 평면 (BMP)의 문자의 경우 결과 인코딩은 단일 16 비트 단어입니다. 다른 평면의 문자의 경우 인코딩은 16 비트 단어 쌍을 초래합니다."

부울에 대한 내 추측은 기본 레지스터가 32 비트이기 때문에 4 바이트 일 것입니다. 이는 비트 동작을 사용하지 않는 한 .NET이 효율적으로 논리적으로 작동 할 수있는 최소 크기입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top