문제

예를 들어 두 가지 사례가있는 열거가 있다면 부울보다 더 많은 메모리를 취하게됩니까? 언어 : Java, C ++

도움이 되었습니까?

해결책

Java에서 enum 본격적인 계급입니다:

Java 프로그래밍 언어 열거 유형은 다른 언어의 상대보다 훨씬 강력합니다. 열거 선언은 클래스 (열거 형 유형이라고 함)를 정의합니다. 열거 클래스 본문에는 방법 및 기타 필드가 포함될 수 있습니다.

각각의 실제 크기를보기 위해 enum, 실제를 만들어 봅시다 enum 의 내용을 조사하십시오 class 생성 된 파일.

우리에게 다음과 같이 가정 해 봅시다 Constants 열거 수업 :

public enum Constants {
  ONE,
  TWO,
  THREE;
}

위를 컴파일합니다 enum 그리고 분해 결과 class 파일 javap 다음을 제공합니다.

Compiled from "Constants.java"
public final class Constants extends java.lang.Enum{
    public static final Constants ONE;
    public static final Constants TWO;
    public static final Constants THREE;
    public static Constants[] values();
    public static Constants valueOf(java.lang.String);
    static {};
}

분해는 각 필드를 보여줍니다 enum 인스턴스입니다 Constants enum 수업. (추가 분석 javap 호출하여 새 개체를 만들어 각 필드가 초기화된다는 것을 보여줍니다. new Constants(String) 정적 초기화 블록의 생성자.)

그러므로 우리는 각각을 말할 수 있습니다 enum 우리가 만든 필드는 적어도 JVM에서 객체를 만드는 오버 헤드만큼이나 많습니다.

다른 팁

Java에서는 메모리에 열거 값의 각 값의 하나의 인스턴스 만 있어야합니다. 열거에 대한 참조는 해당 참조를 위해 스토리지 만 필요합니다. 열거의 값을 확인하는 것은 다른 참조 비교만큼 효율적입니다.

대량의 열거를 저장할 때만 걱정할 것입니다. Java의 경우 경우에 따라 열거를 사용할 수 있습니다. 내부적으로 비트 벡터를 사용하여 매우 공간 효율적이고 빠릅니다.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/enumset.html

bool 단일 바이트로 구현 될 수 있지만 일반적으로 구조에서는 부울이 적어도 많은 공간을 점유하고 있음을 의미하는 정렬 요구 사항이있는 다른 요소로 둘러싸여 있습니다. int.

최신 프로세서는 메인 메모리에서 전체 캐시 라인, 64 바이트로 데이터를로드합니다. L1 캐시에서 하나의 바이트를로드하는 것과 4 바이트를로드하는 것의 차이는 무시할 수 있습니다.

매우 고성능 응용 프로그램에서 캐시 라인을 최적화하려는 경우, 열거가 얼마나 큰지 걱정할 수 있지만 일반적으로 부울을 사용하는 것보다 열거를 정의하는 것이 더 명확하다고 말합니다.

Java에서는 더 많은 기억이 필요합니다. C ++에서는 동일한 유형의 상수에 필요한 것보다 메모리가 필요하지 않습니다 (컴파일 타임에 평가되며 런타임에 잔류의 중요성이 없습니다). C ++에서, 이는 열거의 기본 유형이 int와 동일한 공간을 차지한다는 것을 의미합니다.

ISO C ++에서는 열거가 가장 큰 열거자가 요구하는 것보다 열거가 더 크다는 의무가 없습니다. 특히, enum {true, false}는 (1) 크기가 크기 (bool) == sizeof (int)를 가질 수 있습니다. 단순히 요구 사항이 없습니다. 일부 컴파일러는 열거를 int와 같은 크기로 만듭니다. 이는 표준이 최소값 만 부과하기 때문에 허용되는 컴파일러 기능입니다. 다른 컴파일러는 확장을 사용하여 열거의 크기를 제어합니다.

printf("%d", sizeof(enum));

C ++에서 열거는 일반적으로 int. 즉, 컴파일러가 열거의 크기를 정의 된 값의 범위에 맞는 가장 작은 크기로 설정할 수 있도록 명령 줄 스위치를 제공하는 것은 드문 일이 아닙니다.

아니요, 열거는 일반적으로 부울과 동일한 int와 같은 크기입니다.

열거가 두 가지만 있으면 실제로 부울을 사용하는 것이 자바에서 더 나은 아이디어 (메모리 크기, 성능, 사용/논리) 일 수 있습니다.
메모리 비용에 대해 궁금한 점이 있다면 많은 메모리 비용을 사용할 계획이있을 수 있습니다. Java에서는 Bitset 클래스 또는 더 작은 규모로 두 언어로 비트 작동으로 비트를 조작 할 수 있습니다.

크기 (Enum)는 열거에있는 것에 따라 다릅니다. 최근에 기본 생성자 매개 변수가 있고 내부에 저장된 객체가없는 ArrayList ()의 크기를 찾으려고 노력했습니다 (이는 저장 용량이 10임을 의미합니다). ArrayList가 너무 크지 않다는 것이 밝혀졌습니다.

따라서 매우 간단한 열거의 크기 (Enum)는 10 바이트 미만이어야합니다. 작은 프로그램을 작성하고 일정량의 메모리를 제공 한 다음 열거를 할당 할 수 있습니다. 당신은 그것을 알아낼 수 있어야합니다 (이것이 내가 Arraylist의 기억을 찾은 방법입니다)

Br,
~ a

C/C ++에서 열거는 int와 동일합니다.

GCC를 사용하면 추가 할 수 있습니다 기인하다((PACKED)) 최소 발자국을 가져 오기 위해 열거 정의로. 열거에서 가장 큰 값이 <256 인 경우 가장 큰 값이 <65536 등이면 두 바이트가됩니다.

typedef enum {
    MY_ENUM0,
    MY_ENUM1,
    MY_ENUM2,
    MY_ENUM3,
    MY_ENUM4,
    MY_ENUM5
} __attribute__((packed)) myEnum_e;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top