Domanda

Ad esempio se ho un Enum con due casi, ci vuole più memoria di un booleano? Lingue: Java, C ++

È stato utile?

Soluzione

In Java, una enum è una classe in piena regola :

  

Tipi di enum del linguaggio di programmazione Java   sono molto più potenti dei loro   controparti in altre lingue. Il   la dichiarazione enum definisce una classe   (chiamato un tipo enum). La classe enum   il corpo può includere metodi e altro   campi.

Per vedere la dimensione effettiva di ogni class, facciamo un Constants effettivo ed esaminiamo il contenuto del javap file che crea.

Supponiamo di avere la seguente new Constants(String) enum class:

public enum Constants {
  ONE,
  TWO,
  THREE;
}

Compilando il <=> sopra e disassemblando il <=> file risultante con <=> si ottiene quanto segue:

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

Lo smontaggio mostra che ogni campo di un <=> è un'istanza della classe <=> <=>. (Un'ulteriore analisi con <=> rivelerà che ogni campo è inizializzato creando un nuovo oggetto chiamando il <=> costruttore nel blocco di inizializzazione statica.)

Pertanto, possiamo dire che ogni <=> campo che creiamo sarà almeno pari al sovraccarico della creazione di un oggetto nella JVM.

Altri suggerimenti

In Java, dovrebbe esserci solo un'istanza di ciascuno dei valori del tuo enum in memoria. Un riferimento all'enum richiede quindi solo l'archiviazione per quel riferimento. Controllare il valore di un enum è efficiente come qualsiasi altro confronto di riferimento.

Ti preoccuperai solo di questo quando si memorizzano grandi quantità di enumerazioni. Per Java, in alcuni casi potresti essere in grado di utilizzare un EnumSet. Usa internamente un bit vettoriale che è molto efficiente in termini di spazio e veloce.

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

bool potrebbe essere implementato come un singolo byte, ma in genere in una struttura sarebbe circondato da altri elementi che hanno requisiti di allineamento che significherebbe che il booleano occuperebbe effettivamente almeno lo spazio di un int .

I processori moderni caricano i dati dalla memoria principale come un'intera riga della cache, 64 byte. La differenza tra il caricamento di un byte dalla cache L1 e il caricamento di quattro byte è trascurabile.

Se stai cercando di ottimizzare le linee della cache in un'applicazione ad alte prestazioni, potresti preoccuparti di quanto sia grande il tuo enum, ma in generale direi che è più chiaro definire un enum che usare un booleano.

In Java, ci vorrebbe più memoria. In C ++, non richiederebbe memoria di quanto richiesto per una costante dello stesso tipo (viene valutato in fase di compilazione e non ha alcun significato residuo in fase di esecuzione). In C ++, ciò significa che il tipo predefinito per un enum occuperà lo stesso spazio di un int.

In ISO C ++ non è obbligatorio che un enum sia più grande di quanto richieda il suo enumeratore più grande. In particolare, enum {TRUE, FALSE} può avere sizeof (1) anche quando sizeof (bool) == sizeof (int). Non c'è semplicemente nessun requisito. Alcuni compilatori rendono gli enum delle stesse dimensioni di un int. Questa è una funzione del compilatore, che è consentita perché lo standard impone solo un minimo. Altri compilatori usano estensioni per controllare le dimensioni di un enum.

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

In C ++ un enum ha in genere le stesse dimensioni di un int. Detto questo, non è insolito che i compilatori forniscano un'opzione da riga di comando per consentire alle dimensioni dell'enum di essere impostate sulla dimensione più piccola adatta all'intervallo di valori definito.

No, un enum ha generalmente le stesse dimensioni di un int, uguale a booleano.

Se il tuo enum avrà mai solo due casi, usare un booleano potrebbe essere un'idea migliore (dimensione della memoria, prestazioni, utilizzo / logica), ancora di più in Java.
Se ti stai chiedendo quale sia il costo della memoria, è possibile che tu abbia intenzione di usarne molti. In Java puoi usare la classe BitSet, o su scala ridotta, in entrambe le lingue puoi manipolare i bit con operazioni bit a bit.

sizeof (enum) dipende da cosa hai nell'enum. Di recente stavo cercando di trovare le dimensioni di un ArrayList () con parametri predefiniti del costruttore e nessun oggetto memorizzato all'interno (il che significa che la capacità di memorizzare è 10). Si è scoperto che ArrayList non è troppo grande! 100 byte.

Quindi, sizeof (enum) per un enum molto semplice dovrebbe essere inferiore a 10 byte. puoi scrivere un piccolo programma, dargli una certa quantità di memoria e quindi provare ad allocare enum. dovresti essere in grado di capirlo (è così che ho scoperto la memoria di ArrayList)

BR,
~ A

In C / C ++ un enum avrà le stesse dimensioni di un int.

Con gcc puoi aggiungere attributo ((compresso)) alla definizione di enum per fargli assumere il minimo footprint. Se il valore più grande nell'enum è & Lt; 256 questo sarà un byte, due byte se il valore più grande è & Lt; 65536, ecc.

typedef enum {
    MY_ENUM0,
    MY_ENUM1,
    MY_ENUM2,
    MY_ENUM3,
    MY_ENUM4,
    MY_ENUM5
} __attribute__((packed)) myEnum_e;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top