Pregunta

Por ejemplo, si tengo un Enum con dos casos, ¿hace que tome más memoria que un booleano? Lenguajes: Java, C ++

¿Fue útil?

Solución

En Java, un enum es una clase completa :

  

Tipos de enumeración del lenguaje de programación Java   son mucho más poderosos que sus   contrapartes en otros idiomas. los   declaración enum define una clase   (llamado un tipo de enumeración). La clase enum   cuerpo puede incluir métodos y otros   campos.

Para ver el tamaño real de cada class, hagamos un Constants real y examinemos el contenido del archivo javap que crea.

Digamos que tenemos la siguiente new Constants(String) clase de enumeración:

public enum Constants {
  ONE,
  TWO,
  THREE;
}

Compilar el <=> anterior y desarmar el archivo <=> resultante con <=> proporciona lo siguiente:

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

El desmontaje muestra que cada campo de un <=> es una instancia de la clase <=> <=>. (Un análisis posterior con <=> revelará que cada campo se inicializa creando un nuevo objeto llamando al constructor <=> en el bloque de inicialización estática).

Por lo tanto, podemos decir que cada campo <=> que creamos será al menos tanto como la sobrecarga de crear un objeto en la JVM.

Otros consejos

En Java, solo debe haber una instancia de cada uno de los valores de su enumeración en la memoria. Una referencia a la enumeración requiere solo el almacenamiento para esa referencia. Verificar el valor de una enumeración es tan eficiente como cualquier otra comparación de referencia.

Solo se preocuparía por esto cuando almacene grandes cantidades de enumeraciones. Para Java, es posible que pueda usar un EnumSet en algunos casos. Utiliza un vector de bits internamente que es muy eficiente en espacio y rápido.

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

bool podría implementarse como un solo byte, pero normalmente en una estructura estaría rodeado de otros elementos que tienen requisitos de alineación que significarían que el booleano ocuparía efectivamente al menos tanto espacio como un int .

Los procesadores modernos cargan datos de la memoria principal como una línea de caché completa, 64 bytes. La diferencia entre cargar un byte del caché L1 y cargar cuatro bytes es insignificante.

Si está intentando optimizar las líneas de caché en una aplicación de muy alto rendimiento, entonces podría preocuparse por el tamaño de su enumeración, pero en general diría que es más claro definir una enumeración que utilizar un valor booleano.

En Java, tomaría más memoria. En C ++, no necesitaría memoria de la requerida para una constante del mismo tipo (se evalúa en tiempo de compilación y no tiene significación residual en tiempo de ejecución). En C ++, esto significa que el tipo predeterminado para una enumeración ocupará el mismo espacio que un int.

En ISO C ++ no hay obligación de que una enumeración sea mayor de lo que requiere su enumerador más grande. En particular, enum {TRUE, FALSE} puede tener sizeof (1) incluso cuando sizeof (bool) == sizeof (int). Simplemente no hay requisito. Algunos compiladores hacen que las enumeraciones tengan el mismo tamaño que un int. Esa es una característica del compilador, que está permitida porque el estándar solo impone un mínimo. Otros compiladores usan extensiones para controlar el tamaño de una enumeración.

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

En C ++, una enumeración suele ser del mismo tamaño que una int. Dicho esto, no es raro que los compiladores proporcionen un cambio de línea de comando para permitir que el tamaño de la enumeración se establezca en el tamaño más pequeño que se ajuste al rango de valores definidos.

No, una enumeración es generalmente del mismo tamaño que un int, igual que booleano.

Si su enumeración alguna vez tendrá solo dos casos, de hecho, usar un booleano en su lugar podría ser una mejor idea (tamaño de memoria, rendimiento, uso / lógica), aún más en Java.
Si se está preguntando sobre el costo de la memoria, podría implicar que planea usar muchos de ellos. En Java puede usar la clase BitSet, o en una escala más pequeña, en ambos idiomas puede manipular bits con operaciones bit a bit.

sizeof (enum) depende de lo que tenga en la enumeración. Recientemente estaba tratando de encontrar el tamaño de un ArrayList () con parámetros de constructor predeterminados y sin objetos almacenados dentro (lo que significa que la capacidad de almacenamiento es 10). Resultó que ArrayList no es demasiado grande & Lt; 100 bytes.

Entonces, sizeof (enum) para una enumeración muy simple debe ser inferior a 10 bytes. puede escribir un pequeño programa, asignarle una cierta cantidad de memoria y luego intentar asignar enumeraciones. deberías poder resolverlo (así es como descubrí la memoria de ArrayList)

BR,
~ A

En C / C ++, una enumeración tendrá el mismo tamaño que un int.

Con gcc puede agregar atributo ((empaquetado)) a la definición de enumeración para que tome la huella mínima. Si el valor más grande en la enumeración es & Lt; 256 esto será un byte, dos bytes si el valor más grande es & Lt; 65536, etc.

typedef enum {
    MY_ENUM0,
    MY_ENUM1,
    MY_ENUM2,
    MY_ENUM3,
    MY_ENUM4,
    MY_ENUM5
} __attribute__((packed)) myEnum_e;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top