valueof enum java c++ memory enums

java - valueof - ¿Cuánta memoria toman los Enums?



java enum valueof (12)

En C ++ una enumeración es típicamente 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.

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


En C / C ++, una enumeración será del mismo tamaño que una int.

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

typedef enum { MY_ENUM0, MY_ENUM1, MY_ENUM2, MY_ENUM3, MY_ENUM4, MY_ENUM5 } __attribute__((packed)) myEnum_e;


En ISO C ++ no hay obligación para que una enumeración sea más grande 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 una 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.


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 luego requiere solo el almacenamiento para esa referencia. Verificar el valor de una enumeración es tan eficiente como cualquier otra comparación de referencia.


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 importancia residual en el tiempo de ejecución). En C ++, esto significa que el tipo predeterminado para una enumeración ocupará el mismo espacio que un int.


No, una enumeración generalmente tiene el mismo tamaño que una int, lo mismo que boolean.


Si tu enumeración tendrá solo dos casos, usar una booleana podría ser una mejor idea (tamaño de la memoria, rendimiento, uso / lógica), incluso 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 tienes en la enumeración. Hace poco estuve tratando de encontrar el tamaño de una ArrayList () con parámetros de constructor por defecto y sin objetos almacenados en el interior (lo que significa que la capacidad para almacenar es 10). Resultó que ArrayList no es demasiado grande <100 bytes.

Entonces, sizeof (enum) para una enumeración muy simple debería tener menos de 10 bytes. puedes escribir un programa pequeño, darle una cierta cantidad de memoria y luego intentar asignar enums. deberías ser capaz de resolverlo (así es como descubrí la memoria de ArrayList)

BR,
~ A


bool podría implementarse como un solo byte, pero típicamente en una estructura estaría rodeado por otros elementos que tienen requisitos de alineación que significarían que el booleano estaría ocupando 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 desde la memoria caché L1 y cargar cuatro bytes es insignificante.

Si está tratando de 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 usar un booleano.


En Java, una enum es una clase completa :

Los tipos de enum del lenguaje de programación Java son mucho más poderosos que sus contrapartes en otros idiomas. La declaración enum define una clase (llamada tipo enum). El cuerpo de la clase enum puede incluir métodos y otros campos.

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

Digamos que tenemos la siguiente clase enum Constants :

public enum Constants { ONE, TWO, THREE; }

La compilación de la enum anterior y el desmontaje del archivo de class resultante con javap da 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 una enum es una instancia de la clase Constants enum . (Un análisis posterior con javap revelará que cada campo se inicializa creando un nuevo objeto llamando al new Constants(String) constructor new Constants(String) en el bloque de inicialización estático).

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


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