2009-03-10 11 views
5

Tengo curiosidad por saber por qué los campos de bits con el mismo tipo de datos toman menos tamaño que con los tipos de datos mixtos .por qué los campos de bits para los mismos tipos de datos tienen menos tamaño en comparación con los campos de bits para los tipos de datos mixtos

struct xyz 
{ 
    int x : 1; 
    int y : 1; 
    int z : 1; 
}; 


struct abc 
{ 
    char x : 1; 
    int y : 1; 
    bool z : 1; 
}; 

sizeof (xyz) = 4 sizeof (abc) = 12.

estoy usando VS 2005, la máquina de 64 bits x86.

Una respuesta de nivel de máquina/compilador de bits sería genial.

Respuesta

4

Alineación.

Su compilador va a alinear las variables de una manera que tenga sentido para su arquitectura. En su caso, char, int y bool son de diferentes tamaños, por lo que irá por esa información en lugar de sus sugerencias de campo de bits.

Hubo un debate en this question al respecto.

La solución es dar directivas #pragma o __attributes__ a su compilador para indicarle que ignore las optimizaciones de alineación.

+1

Sin embargo, tenga en cuenta que los campos de bits realmente no tienen requisitos de alineación. –

+0

No, pero el compilador no tiene obligación de empaquetarlos. – greyfade

+0

Ver ISO14882: 2003, §9.6, párrafo 1. – greyfade

3

El estándar C (versión de 1999, §6.7.2.1, página 102, punto 10) dice lo siguiente:

Una implementación puede asignar cualquier unidad de almacenamiento direccionable lo suficientemente grande como para contener un campo de bits . Si queda suficiente espacio, un campo de bits que sigue inmediatamente a otro campo de bits en una estructura deberá empaquetarse en bits adyacentes de la misma unidad.

No parece haber ningún texto que permita que el embalaje se vea afectado por los tipos de campos. Por lo tanto, concluiría que este es un error del compilador.

gcc hace una estructura de 4 bytes en cualquier caso, tanto en una máquina de 32 bits como de 64 bits, bajo Linux. No tengo VS y no puedo probar eso.

+1

C++ 03, §9.6, párrafo 1 dice: "La asignación de campos de bits dentro de un objeto de clase está definida por la implementación. La alineación de los campos de bits está definida por la implementación. Los campos de bits se empaquetan en una unidad de asignación direccionable". Parece que mahesh está usando un compilador de C++. – greyfade

+0

Por otro lado, también etiquetó esto como una pregunta en C, no solo en C++. Supongo que la respuesta es diferente para C y C++. –

+0

Sería cauteloso de reclamar esto como un "error" ya que estaba citando el estándar ISO C99. MSVC++ no hace ningún reclamo de adherencia a C99. Es compatible con ISO C90/ANSI C89. – Clifford

0

Es un error de compilación o algún error de código. Todos los bits asignados en la estructura siempre intentan hacer que se defina el tamaño del tipo de datos más alto. p. En la estructura xyz, el tamaño del tipo de datos más alto es 4, es decir, de int. De forma similar para la segunda estructura abc, el tamaño de tipo de datos más alto es 4 para int.

Donde como si cambiamos las variables de la estructura de la siguiente manera: struct abc { char a: 1; char b: 1; bool c: 1; };

sizeof (abc) sería 1 no 4. Dado que el tipo de datos de mayor tamaño es 1 y todos los bits caben en 1byte de caracteres.

Se pueden realizar varias pruebas cambiando el tipo de datos en la estructura.

Enlace para la salida basada en la estructura de edad: Visita http://codepad.org/6j5z2CEX

Enlace de salida en base a la estructura definida anteriormente por mí: Visita http://codepad.org/fqF9Ob8W

Para evitar este tipo de problemas para las estructuras sizeof vamos a empacar adecuadamente estructuras utilizando #pragma pack macro.

Cuestiones relacionadas