2010-02-10 12 views

Respuesta

20
struct record { 
    char *name; 
    int refcount : 4; 
    unsigned dirty : 1; 
}; 

Esos son campos de bits; el número da el tamaño exacto del campo, en bits. (Consulte cualquier libro completo sobre C para obtener más detalles.) Los campos de bits se pueden usar para ahorrar espacio en estructuras que tienen varios indicadores binarios u otros campos pequeños, y también se pueden usar en un intento de ajustarse a diseños de almacenamiento impuestos externamente. (Su éxito en la última tarea se ve mitigado por el hecho de que los campos de bits se asignan de izquierda a derecha en algunas máquinas y de derecha a izquierda en otras).

Tenga en cuenta que la notación de dos puntos para especificar el tamaño de un campo en bits solo es válida en estructuras (y en uniones); no puede usar este mecanismo para especificar el tamaño de las variables arbitrarias.

  • Referencias: K & R1 seg. 6,7 pp. 136-8
  • K & R2 Sec. 6.9 pp. 149-50
  • ISO Sec. 6.5.2.1
  • H & S Seg. . 5.6.5 pp 136-8
4

Significa que start es 1 bit de ancho, en contraposición a la normal bool que es de 1 byte de largo. Puede empaquetar múltiples variables más pequeñas en una variable más grande y el compilador generará todo el código necesario para leerlo/escribirlo. Recibirá un golpe de rendimiento (notable), pero, si lo usa correctamente, usará mucha menos memoria.

+0

Rendimiento de qué? Supongo que el proceso de compilación se ralentiza (lo que no debería ser un problema), ¿pero también se ralentiza el rendimiento del tiempo de ejecución? – Oxymoron

+0

Sí, en el tiempo de ejecución cada acceso que realice a estas variables (ya sea de lectura o escritura) tiene que traducirse a accesos a nivel de bit. Por ejemplo, si lee una de estas cosas, primero tiene que cargar el campo grande en un registro, Y lo hace con una máscara y luego cambia a la derecha, que es al menos 3 veces más lento que una lectura normal. Lo mismo ocurre con la escritura. – Blindy

+0

Se pone aún peor con los campos de bits de límites cruzados, tienen que combinarse, doblando la cantidad de trabajo (si no se ignoran por completo). – Blindy

3

Esto hace que el miembro de start en un campo de bits, con 1 bit de espacio reservado.

Es válido sólo para miembros de la estructura/clase, no se puede tener una variable de campo de bits.

4

Ver la entrada de Wikipedia sobre Bit Fields. Le dice al compilador cuántos bits debe ocupar el miembro de la estructura.

2

Esta es la sintaxis para bit fields

En esencia, se define un campo de una estructura para tener sólo unos pocos bits de un byte completo o short o int.
Varios campos de bits pueden compartir el mismo int, por lo que este método se puede utilizar como una forma inteligente de evitar algunas manipulaciones de bits en la construcción de valores.

1

Es un bit-field. Pero nunca intenté hacer bit-fields en boolean.

2

Esta es la sintaxis para describir bit fields. Esta es una forma de empaquetar más información en una cantidad menor de almacenamiento. Mientras que normalmente un bool tomaría al menos un byte (probablemente más) para representar, mediante el uso de campos de bits, puede combinar varios bools en un byte con una sintaxis simple.

Ten cuidado. Como una de las áreas menos conocidas del idioma, puede encontrarse con casos de esquina cuando los usa.Por ejemplo, las estructuras de datos así producidas probablemente no son portátiles entre los tipos de procesadores.