2010-06-21 9 views
9

¿Se pueden usar bitfields en unión?c union y bitfields

+12

Al hacer dos cosas malvadas, ¿suman o se multiplican? ;-) –

+0

+1 a Amardeep. No hagas ni hagas a divya. –

+0

Neighter bitfields ni sindicatos deben ser malvados. Uso structs en uniones para analizar la entrada/salida de bytes en el software incorporado. Su comodidad supera sus desventajas. – schmijos

Respuesta

2

Sí, es posible, pero recomendaría no hacerlo. La longitud y el empaque de los campos de bits no son portátiles. El tamaño de la unión será difícil de predecir (ver here). Hay una cierta cantidad de complejidad que introduce en el código cuando usa uniones o campos de bits. Si bien esta complejidad puede ser aceptable en su código, la combinación de los dos puede resultar en una cantidad inaceptable de complejidad. Si está utilizando uniones, estructuras y campos de bits, se encontrará con problemas con la alineación de la memoria.

Si se trata de un código de un solo uso que solo debe construirse y ejecutarse en una máquina, entonces probablemente esté bien. Sin embargo, si está comprobando esto en el control de versiones donde permanecerá por siempre, recomiendo que no lo haga.

Si da un ejemplo de por qué desea hacer esto, yo u otra persona puedo sugerir una mejor alternativa.

EDIT: aclarado en función de los comentarios y para solicitar comentarios.

+3

¿Qué no es portátil acerca de los campos de bits en los sindicatos en comparación con solo los campos de bits en general? ¿Qué será específicamente difícil de predecir? – AnT

+3

La queja en la publicación que vinculó fue sobre el tamaño de() una unión que contiene un campo de bits, no el comportamiento. El tamaño de la estructura siempre depende de la implementación y no tiene nada que ver con el campo de bits. También hubo una queja sobre no poder tomar la dirección de un miembro de bitfield, pero así es como funcionan los bitfields y no tiene nada que ver con la unión. – Alan

+0

Actualizado para ser menos vago. En general, soy hiperparanoide sobre la alineación de tamaño/memoria porque trabajo en firmware para microcontroladores. Las estructuras o variables desalineadas afectan el rendimiento y pueden generar cargas y almacenes no atómicos. Su experiencia puede ser diferente. –

8

Sí, pueden serlo. Por qué no? Los campos de bits en las uniones se comportan de la misma manera en que se comportan en cualquier otro lugar. No hay nada especial sobre los campos de bits en los sindicatos (o sindicatos con campos de bits).

0

No es seguro escribir en un elemento de unión y leer uno diferente. Si los detalles de su implementación aseguran que eso no ocurra, entonces una unión que contiene un bitfied (y presumiblemente otros miembros) tiene un comportamiento bien definido y seguro.

+0

¿No se ha definido la implementación de los juegos de palabras de unión? – detly

+1

Esto no es C++: el tipo de juego de palabras a través de uniones es perfectamente válido en C y se comporta de manera similar al 'reinterpret_cast' de C++. El Corrigendum técnico 3 lo deja en claro. –

2

Si piensas cómo funciona la unión, tienes la respuesta, que es sí, por supuesto (¿por qué no?). Como esperamos, la unión es lo suficientemente grande como para contener el datum más grande, y de manera automática, el más pequeño. Los bitfields están empaquetados en "contenedores" y el compilador debe poder evaluar su tamaño real final. A continuación se muestran algunos hechos interesantes (y por supuesto es un uso incorrecto de una unión, ¡pero no para la presencia del campo de bits!)

#include <stdio.h> 

union test { 
    int a:5; 
    int b:12; 
    float c; 
    double d; 
    int x; 
}; 

int main() 
{ 
    union test x; 
    printf("%d\n", sizeof(x)); 
    x.a = 31; 
    printf("%d\n", x.a); 
    printf("%d\n", x.b); 
    x.c = 1.23; 
    printf("%d\n", x.a); 
    printf("%f\n", x.c); 
    x.x = 31; 
    printf("%d\n", x.x); 
    printf("%d\n", x.a); 
    printf("%d\n", x.b); 
}