Pergunta

Por exemplo, se eu tenho um Enum com dois casos, isso faz demorar mais memória do que um booleano? Idiomas: Java, C ++

Foi útil?

Solução

Em Java, um enum é uma classe full-blown :

tipos enum linguagem de programação Java são muito mais poderosos do que os seus contrapartes em outros idiomas. o declaração enum define uma classe (Chamado um tipo enum). A classe enum corpo pode incluir métodos e outros campos.

Para ver o tamanho real de cada enum, vamos fazer uma enum real e examinar o conteúdo do arquivo class ele cria.

Vamos dizer que temos a seguinte classe Constants enum:

public enum Constants {
  ONE,
  TWO,
  THREE;
}

Compilando o enum acima e desmontagem resultando arquivo class com javap dá a seguinte:

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 {};
}

As mostras de desmontagem que que cada campo de um enum é uma instância da classe Constants enum. (Uma análise mais aprofundada com javap revelará que cada campo é inicializado através da criação de um novo objeto chamando o construtor new Constants(String) no bloco de inicialização estática.)

Portanto, podemos dizer que cada campo enum que criamos será, pelo menos tanto quanto a sobrecarga de criar um objeto na JVM.

Outras dicas

Em Java, deve haver apenas uma instância de cada um dos valores de sua enumeração na memória. Uma referência para a enumeração em seguida, requer apenas o armazenamento para que a referência. Verificando o valor de um enum é tão eficiente quanto qualquer outra comparação de referência.

Você só me preocuparia com isso quando armazenar grandes quantidades de enums. Para Java, você pode ser capaz de usar um EnumSet em alguns casos. Ele usa um vetor de bits internamente que é muito espaço eficiente e rápido.

http: //java.sun. com / J2SE / 1.5.0 / docs / api / java / util / EnumSet.html

bool pode ser implementado como um único byte, mas tipicamente numa estrutura que iria ser rodeado por outros elementos que não têm requisitos de alinhamento, isso significaria que o booleano seria efectivamente que ocupa, pelo menos, tanto espaço quanto um int.

Os processadores modernos carregar dados de memória principal como uma linha de cache todo, 64 bytes. A diferença entre o carregamento de um byte do cache L1 e quatro bytes de carga é negligenciável.

Se você está tentando otimizar para linhas de cache em uma aplicação muito de alta performance, então você pode se preocupar com o tamanho de sua enumeração é, mas geralmente eu diria que é mais clara para definir uma enumeração do que usar um booleano.

Em Java, seria necessário mais memória. Em C ++, levaria nenhuma memória do que o necessário para uma constante do mesmo tipo (é avaliada em tempo de compilação e não tem nenhum significado residual em tempo de execução). Em C ++, isso significa que o tipo padrão para um enum irá ocupar o mesmo espaço como um int.

ISO C ++ não existe a obrigação de uma enumeração para ser maior do que a sua maior enumerador requer. Em particular, enum {VERDADEIRO, FALSO} pode ter sizeof (1) mesmo quando sizeof (bool) == sizeof (int). Não há simplesmente nenhuma exigência. Alguns compiladores fazer os enums o mesmo tamanho de um int. Essa é uma característica do compilador, o que é permitido porque a norma impõe apenas um mínimo. Outros compiladores usar extensões para controlar o tamanho de um enum.

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

C ++ um enum é tipicamente do mesmo tamanho que um int. Dito isto, não é incomum para compiladores para fornecer uma opção de linha de comando para permitir que o tamanho do enum para ser definido como o menor tamanho que se encaixa na faixa de valores definidos.

Não, um enum é geralmente o mesmo tamanho de um int, mesmo que boolean.

Se o seu enum nunca vai ter apenas dois casos, de fato usando um boolean em vez pode ser uma idéia melhor (tamanho da memória, desempenho, uso / lógica), ainda mais em Java.
Se você está se perguntando sobre o custo de memória, que pode implicar que você pretende usar muitos deles. Em Java você pode usar classe BitSet, ou em menor escala, em ambas as línguas que você pode manipular os bits com operações bit a bit.

sizeof (enum) depende do que você tem no enum. Recentemente eu estava tentando encontrar o tamanho de um ArrayList () com parâmetros construtor padrão e nenhum objeto dentro armazenado (o que significa que a capacidade de armazenamento é 10). Descobriu-se que ArrayList não é muito grande <100 bytes.

Assim, sizeof (enum) para uma enumeração muito simples deve ser inferior a 10 bytes. você pode escrever um pequeno programa, dar-lhe uma certa quantidade de memória e tente enums alocação. você deve ser capaz de descobrir isso (que é como eu descobri a memória de ArrayList)

BR,
~ A

C / C ++ um enum será o mesmo tamanho que um int.

Com gcc você pode adicionar atributo ((embalado)) para a definição enum para torná-lo tomar a pegada mínimo. Se o maior valor na enumeração é <256 este será um byte, dois bytes se o maior valor é <65536, etc.

typedef enum {
    MY_ENUM0,
    MY_ENUM1,
    MY_ENUM2,
    MY_ENUM3,
    MY_ENUM4,
    MY_ENUM5
} __attribute__((packed)) myEnum_e;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top