c - sirve - tipo enum java
Especificar el tamaño del tipo de enumeración en C (6)
Ya leí esta pregunta relacionada , pero estaba buscando algo un poco más específico.
- ¿Hay alguna manera de decirle a tu compilador específicamente qué tan ancho quieres que sea tu enumeración?
- Si es así, como lo haces? Sé cómo especificarlo en C #; ¿Se hace de manera similar en C?
- ¿Valdría la pena hacerlo? Cuando el valor enum se pasa a una función, ¿se pasará como un valor de tamaño
int
independientemente?
¿Hay alguna manera de decirle a tu compilador específicamente qué tan ancho quieres que sea tu enumeración?
En general el caso no. No en el estándar C.
¿Valdría la pena hacerlo?
Depende del contexto. Si está hablando de pasar parámetros a funciones, entonces no, no vale la pena hacerlo (ver más abajo). Si se trata de ahorrar memoria al crear agregados a partir de tipos de enumeración, entonces valdría la pena hacerlo. Sin embargo, en C, simplemente puede usar un tipo entero de tamaño adecuado en lugar de un tipo de enumeración en los agregados. En C (a diferencia de C ++) los tipos de enumeración y los tipos enteros son casi siempre intercambiables.
Cuando el valor de enumeración se pasa a una función, ¿se pasará como un valor de tamaño int independientemente?
Muchos (la mayoría) de los compiladores en estos días pasan todos los parámetros como valores de tamaño de palabra natural para la plataforma de hardware dada. Por ejemplo, en una plataforma de 64 bits, muchos compiladores pasarán todos los parámetros como valores de 64 bits, independientemente de su tamaño real, incluso si el tipo int
tiene 32 bits en esa plataforma (por lo tanto, generalmente no se pasa como "int "tamaño" en dicha plataforma). Por esta razón, no tiene sentido tratar de optimizar los tamaños de enumeración para fines de paso de parámetros.
Creo que hay una bandera si está utilizando GCC.
-fshort-enums
Depende de los valores asignados para las enumeraciones.
Ej .: Si se almacena el valor mayor que 2 ^ 32-1, el tamaño asignado para la enumeración general cambiará al siguiente tamaño.
Almacene el valor 0xFFFFFFFFFFFF en una variable de enumeración, dará una advertencia si se intenta compilar en un entorno de 32 bits (advertencia de redondeo) donde, como en una compilación de 64 bits, tendrá éxito y el tamaño asignado será de 8 bytes.
Otra forma es lanzar la enumeración dentro de una unión de la siguiente manera:
union char_size {
char a;
enum {
a = 1,
b = 2,
} val;
};
Si lo hace, forzará al compilador a encajar la enumeración dentro de un char.
Puede forzar que tenga al menos un tamaño determinado definiendo un valor apropiado. Por ejemplo, si desea que su enumeración se almacene con el mismo tamaño que un int
, aunque todos los valores cabrían en un char
, puede hacer algo como esto:
typedef enum {
firstValue = 1,
secondValue = 2,
Internal_ForceMyEnumIntSize = MAX_INT
} MyEnum;
Tenga en cuenta, sin embargo, que el comportamiento puede depender de la implementación.
Como notará, pasar ese valor a una función hará que se expanda a un int de todos modos, pero si está usando su tipo en una matriz o estructura, entonces el tamaño será importante. Si realmente te importa el tamaño de los elementos, deberías usar tipos como int8_t
, int32_t
, etc.
También hay otra forma si la enumeración es parte de una estructura:
struct something {
:0;
enum whatever field:CHAR_BIT;
:0;
};
El: 0; se puede omitir si el campo de enumeración está rodeado por campos normales. Si hay otro campo de bits antes, el: 0 forzará la alineación de bytes al siguiente byte para el campo que lo sigue.