imprimir español enum clase c++ enums sizeof

español - enum c++



¿Cuál es el tamaño de un tipo de datos enum en C++? (8)

Esta es una pregunta de prueba de entrevista de C ++ no deberes.

#include <iostream> using namespace std; enum months_t { january, february, march, april, may, june, july, august, september, october, november, december} y2k; int main () { cout << "sizeof months_t is " << sizeof(months_t) << endl; cout << "sizeof y2k is " << sizeof(y2k) << endl; enum months_t1 { january, february, march, april, may, june, july, august, september, october, november, december} y2k1; cout << "sizeof months_t1 is " << sizeof(months_t1) << endl; cout << "sizeof y2k1 is " << sizeof(y2k1) << endl; }

Salida:

sizeof months_t es 4
sizeof y2k es 4
sizeof months_t1 es 4
sizeof y2k1 es 4

¿Por qué es el tamaño de todos estos 4 bytes? ¿No es 12 x 4 = 48 bytes?
Sé que los elementos de la unión ocupan la misma ubicación de memoria, pero esta es una enumeración.


Esta es una pregunta de prueba de entrevista de C ++ no deberes.

Entonces su entrevistador necesita actualizar su recuerdo con el funcionamiento del estándar C ++. Y cito:

Para una enumeración cuyo tipo subyacente no es fijo, el tipo subyacente es un tipo integral que puede representar todos los valores del enumerador definidos en la enumeración.

La parte completa "cuyo tipo subyacente no es fijo" es de C ++ 11, pero el resto es C ++ 98/03 estándar. En resumen, el sizeof(months_t) no es 4. Tampoco es 2. Podría ser cualquiera de esos. La norma no dice qué tamaño debería ser; solo que debe ser lo suficientemente grande como para caber en cualquier enumerador.

¿por qué todo el tamaño es de 4 bytes? no 12 x 4 = 48 bytes?

Porque las enumeraciones no son variables. Los miembros de una enumeración no son variables reales; solo son una forma de #define segura para el medio tipo. Son una manera de almacenar un número en un formato fácil de leer. El compilador transformará todos los usos de un enumerador en el valor numérico real.

Los enumeradores son solo otra forma de hablar sobre un número. january es solo una abreviatura de 0 . ¿Y cuánto espacio ocupa 0? Depende de en qué lo guardes


Con mis compilaciones de compilador Borland C ++ Builder ahora en envejecimiento puede ser de 1,2 o 4 bytes, aunque tiene un indicador que puede voltear para obligarlo a utilizar ints.

Supongo que es un compilador específico.


Debido a que tiene el tamaño de una instancia del tipo, presumiblemente los valores enum se almacenan como entradas de (32 bits / 4 bytes) aquí.


Depende. El estándar solo exige que sea lo suficientemente grande como para contener todos los valores, por lo que formalmente es una enumeración como enum foo { zero, one, two }; solo necesita ser un byte de gran tamaño. Sin embargo, la mayoría de las implementaciones hacen que las enumeraciones sean tan grandes como ints (eso es más rápido en hardware moderno; además, es necesario para la compatibilidad con C, donde las enumeraciones son, básicamente, glorificados). Sin embargo, tenga en cuenta que C ++ permite enumeraciones con inicializadores fuera del rango int, y para esas enumeraciones, el tamaño, por supuesto, también será mayor. Por ejemplo, si tiene la enum bar { a, b = 1LL << 35 }; entonces su enum será mayor que 32 bits (lo más probable 64 bits) incluso en un sistema con 32 bits de entrada (tenga en cuenta que en C esa enum no estaría permitida).


El tamaño es de cuatro bytes porque la enum se almacena como un int . Con solo 12 valores, solo necesita 4 bits, pero las máquinas de 32 bits procesan cantidades de 32 bits de forma más eficiente que las cantidades más pequeñas.

0 0 0 0 January 0 0 0 1 February 0 0 1 0 March 0 0 1 1 April 0 1 0 0 May 0 1 0 1 June 0 1 1 0 July 0 1 1 1 August 1 0 0 0 September 1 0 0 1 October 1 0 1 0 November 1 0 1 1 December 1 1 0 0 ** unused ** 1 1 0 1 ** unused ** 1 1 1 0 ** unused ** 1 1 1 1 ** unused **

Sin enumeraciones, es posible que tengas la tentación de utilizar enteros sin formato para representar los meses. Eso funcionaría y sería eficiente, pero haría que tu código fuera difícil de leer. Con enumeraciones, obtienes un almacenamiento y una legibilidad eficientes.


Me gusta la explicación de EdX (Microsoft: DEV210x Introducción a C ++) para un problema similar:

"Enum representa los valores literales de días como enteros. En referencia a la tabla de tipos numéricos, verá que un int toma 4 bytes de memoria. 7 días x 4 bytes cada uno requeriría 28 bytes de memoria si se almacenara toda la enumeración pero el el compilador solo usa un solo elemento de la enumeración, por lo tanto, el tamaño en la memoria es en realidad de 4 bytes ".


Una enumeración es casi un número entero. Para simplificar mucho

enum yourenum { a, b, c };

es casi como

#define a 0 #define b 1 #define c 2

Por supuesto, no es realmente cierto. Estoy tratando de explicar que enum hay algún tipo de codificación ...


Una enumeración es como un typedef para el tipo int (tipo de).

Entonces el tipo que ha definido allí tiene 12 valores posibles, sin embargo, una sola variable solo tiene uno de esos valores.

Piénselo de esta manera, cuando define una enumeración, básicamente está definiendo otra forma de asignar un valor int.

En el ejemplo que proporcionó, enero es otra forma de decir 0, feb es otra forma de decir 1, etc. Hasta diciembre es otra forma de decir 11.