Este es un C++ entrevista cuestión de prueba no a la tarea.

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

De salida:

sizeof months_t es de 4

sizeof y2k es de 4

sizeof months_t1 es de 4

sizeof y2k1 es de 4

¿Por qué el tamaño de todos estos 4 bytes? No 12 x 4 = 48 bytes?

Sé que la unión de los elementos que ocupan la misma posición de memoria, pero esta es una enumeración.

  • Cómo nadie hizo mención de la enumeración de las clases? Yo esperaría C++ enthuasiasts ir más allá de la llamada del deber en una pregunta como esta.
  • Deconfusing el OP es la primera orden del día. Nada te detiene de pesaje en la enumeración de las clases de aunque.
  • ¿Quiere usted decir que en C++11 puede especificar el tipo subyacente de una enumeración, que es qué tipo integral, que imita? Por ejemplo enum month : char { january, ... };. La clase de las enumeraciones, alias el ámbito de las enumeraciones, son otra variedad de clases que crear un adjuntando espacio de nombres para sus constantes. La cosa es que la clase de las enumeraciones son siempre, de un determinado tipo subyacente (int si ninguno especificado).
  • Nadie mencionó la enumeración de las clases debido a que es un C++11 característica, y él no preguntar acerca de C++11 funciones.
  • También, es completamente irrelevante para este caso. Que trata de la relación entre el número de los enumeradores y el tamaño del tipo (que es logarítmica, no lineal).
InformationsquelleAutor user1002288 | 2011-11-13

8 Comentarios

  1. 49

    El tamaño es de cuatro bytes debido a que el enum se almacena como un int. Con sólo 12 valores, en realidad solo necesitan 4 bits, pero de 32 bits en máquinas de proceso de 32 bits cantidades de manera más eficiente que las pequeñas cantidades.

    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, usted podría estar tentado a usar raw enteros para representar los meses. Que iba a trabajar y ser eficiente, pero sería hacer que su código sea difícil de leer. Con las enumeraciones, consigue un almacenamiento eficiente y mejorar la legibilidad.

    • Creo que la norma quiere enum a ser el mismo entero. C++11 introducido enumeración de las clases.
    • Ese podría ser el caso. Tienes una cita?
    • También: incluso si C permitió un enum para ser un byte, un compilador de 32 bits más probable es que alinear su enumeración de 32 bits límites, comer hasta 32 bits de todos modos 🙂
    • de esta manera, el total de bits debe ser de 4 x 12 = 48 bits/ 8 = 6 bytes 4 bytes !!!
    • No – una de cuatro bits variable puede representar cualquiera de dieciséis valores diferentes. Usted no necesita un adicional de cuatro bits para cada mes. Si deseaba guardar sus meses como un vector de bits, que solo necesitan de 12 bits. Que aún en forma segura dentro de 4 bytes.
    • La original respuesta es correcta. La enumeración debe ser de al menos un byte, pero un compilador es libre de usar más memoria. Y puesto que usted puede tener las enumeraciones en una matriz, sizeof debe ser un múltiplo de la alineación. Usted no puede tener un byte enum alineados o 4 bytes.
    • Se hace una diferencia si usted #pragma pack(1) y un plan para enviar los datos a través de una conexión de red o guardar en un archivo de disco, donde pueda ser leído por el código compilado con una diferente (versión del compilador.
    • Pre C++11 es una «Muy Mala Idea [TM]» para que dependen sizeof(enum_value)

  2. 100

    Este es un C++ entrevista cuestión de prueba no a la tarea.

    A continuación, el entrevistador necesita actualizar su recuerdo con cómo el estándar de C++ funciona. Y cito:

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

    Todo «cuyo subyacente tipo no es fija» es parte de C++11, pero el resto es el estándar de C++98/03. En resumen, la sizeof(months_t) es no 4. No es la 2 tampoco. Es podría ser cualquiera de los que. La norma no dice de qué tamaño debe ser; sólo que debe ser lo suficientemente grande como para adaptarse a cualquier enumerador.

    razón por la que todos 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, sino que se trata de un semi-tipo-formulario seguro de #define. Son una forma de almacenamiento de un número en una amigable con el formato. El compilador va a transformar todos los usos de un enumerador en el real valor numérico.

    Enumeradores son sólo otra forma de hablar de un número. january es sólo una abreviatura para el 0. Y cuánto espacio no 0 tomar? Depende de lo que usted guarde en.

    • Esta es una excelente respuesta que no debe ser pasado por alto. Aunque mi respuesta proporciona los fundamentos para la comprensión de una enumeración, que realmente necesita para ser capaz de agarrar un enum en este nivel si usted espera que pasen este tipo de pregunta de la entrevista.
    • gracias @Bolas pero se avergüenzan de distancia ¿por qué el compilador elegido 4 bytes en lugar del mínimo que respeta el requisito de nivel, que es 1 byte (12 distintos de los enumeradores:4bits) aquí. Y hay una segunda frase en la norma, que es super raro: this type is not larger than int unless the value of an enumerator cannot fit in an int este me dice que el compilador de los ejecutores estaban dispuestos a ampliar el tipo, incluso si no es necesario, esta segunda frase de los límites de su celo.
    • Que por qué no podría elegir long long; que no es por eso eligió int. Se eligió int porque era una opción válida de acuerdo a la norma y lo sentí así. No por otra razón que.
    • Lol, se implemente la materia en su compilador porque te apetece ? Estoy seguro de que es un boost::int_value_t<V>::least vs boost::int_value_t<V>::fast tipo de elección. O una compatibilidad binaria robustez en la cara de enumerador de cambios.
    • Mi punto es que la elección depende de la implementación. No es algo que se puede predecir o confiar. Eso es parte de la razón por la que ahora permiten a las personas para especificar el tipo real.
    • Pero sin duda. A pesar de que cada decisión puede ser explicado. Si no por la norma, el compilador de los implementadores de saber.

  3. 9

    Depende. La norma sólo exige que sea lo suficientemente grande para contener todos los valores, por lo que formalmente una enumeración como enum foo { zero, one, two }; necesidades de ser sólo un byte de gran tamaño. Sin embargo, la mayoría de las implementaciones de hacer esas enumeraciones tan grande como enteros (que es más rápido en hardware moderno; además, es necesario para la compatibilidad con C, donde las enumeraciones son glorificados ints). Sin embargo, nótese que C++ permite que las enumeraciones con inicializadores de fuera de la int rango, y para los enums el tamaño será, por supuesto, también será mayor. Por ejemplo, si usted tiene enum bar { a, b = 1LL << 35 };, a continuación, su enumeración será más grande que la de 32 bits (lo más probable 64 bits) incluso en un sistema de 32 bits enteros (tenga en cuenta que en C que la enumeración no sería permitido).

  4. 6

    Un enum es como un typedef para el tipo int (tipo de).

    Por lo que el tipo que hemos definido no tiene 12 valores posibles, sin embargo una sola variable sólo tiene uno de esos valores.

    Creo que de esta manera, cuando se define una enumeración, básicamente, la definición de otra forma de asignar un valor int.

    En el ejemplo que usted ha proporcionado, enero es otra manera de decir: 0, febrero es otra manera de decir 1, etc hasta el mes de diciembre es otra manera de decir 11.

  5. 4

    Porque es el tamaño de una instancia del tipo – presumiblemente valores de enumeración son almacenados como (32 bits o 4 bytes) enteros aquí.

  6. 4

    Con mi ahora envejecimiento de Borland C++ Builder compilador de las enumeraciones pueden ser 1, 2 o 4 bytes, aunque tiene una bandera puede voltear para forzar el uso de enteros.

    Supongo que cada compilador.

    • Con gcc, el comportamiento es venerado — las enumeraciones predeterminado para int, pero la bandera -fshort-enums acorta el espacio utilizado por la enumeración de lo que apenas es necesario. (Aunque esto es menos probable óptima.)
  7. 3

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

    «La enumeración representa los valores literales de días enteros. En referencia a los tipos numéricos de la tabla, verá que un int ocupa 4 bytes de memoria. 7 días x 4 bytes cada uno requeriría 28 bytes de memoria si la totalidad de la enumeración se almacena, pero el compilador sólo se utiliza un único elemento de la enumeración, por lo tanto el tamaño de la memoria es en realidad de 4 bytes.»

    • que no tiene ningún sentido.
  8. 1

    Un enum es casi un 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 son algún tipo de codificación…

Dejar respuesta

Please enter your comment!
Please enter your name here