Frage

Zum Beispiel, wenn ich eine Enum mit zwei Fällen habe, macht es mehr Speicher dauern als ein boolean? Sprachen: Java, C ++

War es hilfreich?

Lösung

In Java, ein enum ist eine ausgewachsene Klasse :

  

Programmiersprache Java Enum-Typen   sind viel mächtiger als ihre   Kollegen in anderen Sprachen. Das   enum Erklärung definiert eine Klasse   (Einen ENUM-Typ bezeichnet). Die Enum-Klasse   Körper kann umfassen Verfahren und andere   Felder aus.

Um die tatsächliche Größe jedes enum zu sehen, lassen Sie uns eine tatsächliche enum machen und den Inhalt der class Datei untersuchen es erstellt.

Lassen Sie uns sagen, dass wir die folgende Constants Enum Klasse haben:

public enum Constants {
  ONE,
  TWO,
  THREE;
}

Das Kompilieren der oben enum und Auseinanderbauen resultierende class Datei mit javap ergibt folgende:

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

Die Demontage zeigt, dass, dass jedes Feld eines enum eine Instanz der Constants enum Klasse. (Ein weitere Analyse mit javap wird zeigen, dass jedes Feld, ein neues Objekt, indem durch den Aufruf des new Constants(String) Konstruktor in der statischen Initialisierungsblock initialisiert.)

Daher können wir sagen, dass jedes enum Feld, das wir schaffen werden als Kopf mindestens so viel von einem Objekt in der JVM zu schaffen.

Andere Tipps

In Java, sollte es nur eine Instanz von jedem des Wert Ihrer ENUM in Erinnerung sein. Ein Verweis auf die ENUM erfordert dann nur die Lagerung für die Referenz. den Wert eines Aufzählungs Überprüfung ist so effizient wie jede andere Referenzvergleichs.

Sie würden nur kümmern, wenn große Mengen von Aufzählungen zu speichern. Für Java können Sie in der Lage sein, eine EnumSet in einigen Fällen zu verwenden. Es verwendet einen Bitvektor intern, die sehr platzsparende und schnell ist.

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

bool könnte als ein einziges Byte implementiert werden, aber in der Regel in einer Struktur wäre es von anderen Elementen umgeben sein, die Ausrichtungsanforderungen haben, dass die boolean effektiv mindestens so viel Platz wie ein int würde bedeuten würde besetzen.

Moderne Prozessoren Ladedaten aus dem Hauptspeicher als Ganzer Cache-Zeile, 64 Bytes. Der Unterschied zwischen Laden eines Bytes aus dem L1-Cache und Laden von vier Bytes ist vernachlässigbar.

Wenn Sie versuchen, für Cache-Zeilen in einer sehr leistungsfähigen Anwendung zu optimieren, dann könnten Sie sich Sorgen darüber, wie groß Ihre Enum sind, aber im Allgemeinen würde ich sagen, es klarer ist eine ENUM zu definieren als eine boolean zu verwenden.

In Java würde es mehr Speicherplatz verbrauchen. In C ++, wäre es kein Gedächtnis eingenommen hat, als eine Konstante des gleichen Typs erforderlich (es zum Zeitpunkt der Kompilierung ausgewertet ist und hat keine Rest Bedeutung zur Laufzeit). In C ++, bedeutet dies, dass der Standardtyp für eine Enumeration wird den gleichen Raum wie ein int besetzen.

In der ISO C ++ gibt es keine Verpflichtung für eine Enumeration größer zu sein als sein größter enumerator erfordert. Insbesondere enum {TRUE, FALSE} kann sizeof (1) haben, auch wenn sizeof (int) == sizeof (int). Es gibt einfach keine Anforderung. Einige Compiler machen die Aufzählungen die gleiche Größe wie ein int. Das ist eine Compiler-Funktion, die, weil der Standard nur erlaubt ist, ein Minimum auferlegt. Andere Compiler verwenden Erweiterungen, die Größe eines Enum zu steuern.

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

In C ++ eine Enumeration ist in der Regel die gleiche Größe wie ein int. Das heißt es ist nicht ungewöhnlich für Compiler eine Befehlszeilenoption, um die Größe des Aufzählungs, damit die kleinste Größe festgelegt werden, die den Wertebereich passt definiert.

Nein, eine Enumeration ist in der Regel die gleiche Größe wie ein int, gleich wie boolean.

Wenn Ihr Enum immer nur zwei Fälle haben, in der Tat ein boolean anstelle könnte eine bessere Idee (Speichergröße, Leistung, Verbrauch / Logik) sein, noch mehr in Java.
Wenn Sie Speicherkosten fragen, könnte es bedeuten, Sie planen, viele von ihnen zu verwenden. In Java können Sie BitSet Klasse oder in einem kleineren Maßstab, in beiden Sprachen verwenden, können Sie Bits mit bitweise Operationen manipulieren.

sizeof (ENUM) hängt davon ab, was Sie in der Enum haben. Ich habe versucht, vor kurzem die Größe einer Arraylist () mit Standardkonstruktors params und keine Objekte gespeichert innen zu finden (was bedeutet, die Kapazität zum Speichern von 10). Es stellte sich heraus, dass Arraylist nicht zu groß <100 Bytes ist.

So, sizeof (ENUM) für eine sehr einfache Enumeration sollte weniger als 10 Byte. Sie können ein kleines Programm schreiben, geben ihm eine bestimmte Menge an Speicher und dann die Zuweisung Aufzählungen versuchen. Sie sollten es herauszufinden sein können (das ist, wie ich die Erinnerung an Arraylist herausgefunden)

BR,
~ A

In C / C ++ eine Enumeration wird die gleiche Größe wie ein int sein.

Mit gcc können Sie hinzufügen Attribut ((gepackte)) an die Enumerationsdefinition, um es den minimalen Fußabdruck dauern. Wenn der größte Wert in der Enumeration ist <256 wird dies einen Byte sein, zwei Bytes, wenn der größte Wert <65536, etc.

typedef enum {
    MY_ENUM0,
    MY_ENUM1,
    MY_ENUM2,
    MY_ENUM3,
    MY_ENUM4,
    MY_ENUM5
} __attribute__((packed)) myEnum_e;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top