2009-05-05 18 views
16

Si tengo una estructura C++, la definición de una palabra de datos de 64 bits como ..¿Qué sintaxis de C++ struct "a: b" significa

struct SMyDataWord 
{ 
    int Name : 40; 
    int Colour : 24; 
}; 

¿Qué significa la sintaxis : 40 ... ¿Quiere decir que los primeros 40 bits están reservados para el Nombre y los 24 bits restantes para el Color?

Así es como parece estar siendo utilizado, pero no lo he encontrado antes.

Respuesta

16

Bitfields, transportado desde C. Name tiene 40 bits de ancho, Colour tiene 24 bits de ancho. Su estructura por lo tanto tiene al menos 64 bits. En mi sistema, 64 bits serían 8 bytes.

+6

¿En qué sistema no serían 64bits de 8 bytes? –

+10

Para ser pedante, el número de bits en un byte depende de la implementación (vea el estándar C, C++). Esto viene dado por la macro CHAR_BIT en el encabezado 'limits'. – dirkgently

+1

Algunos mainframes IBM han tenido bytes de 9 bits, IIRC. –

7

Sí, esa es la sintaxis para bitfields. Se usan comúnmente para definir estructuras que se asignan a registros de hardware. Hay algunas cosas a tener en cuenta si decides usarlas, una es que no puedes saber cómo el compilador hace el diseño, el orden y el relleno en los bytes reales que componen los campos pueden diferir entre los compiladores (y quizás con el mismo compilador pero con diferentes configuraciones de optimización también).

+0

En el enlace de MSDN que ofreció, hay una línea: * Tenga en cuenta que nYear tiene 8 bits de longitud y desborda el límite de palabra del tipo declarado, unsigned int.Por lo tanto, se comienza al comienzo de una nueva int sin firmar. * ¿Es la explicación incorrecta de acuerdo con la figura de arriba? – zhangxaochen

6

Esa es una definición de campo de bits.

El nombre es un número entero que puede almacenar exactamente 40 bits de información. El color puede almacenar 24 bits.

Esto se hace a menudo para ahorrar espacio en las estructuras que a menudo se necesitan, o comprimir código hasta un tamaño que sea fácil de manejar para la CPU (en su caso 64 bits. Se ajusta exactamente a un registro de CPU en una máquina de 64 bits) .

El código que accede a los campos de bits se ejecutará un poco más lento.

3

Use them judiciously:

Recuerde que casi todo acerca de los campos de bits es aplicación dependiente. Por ejemplo, si los bits se almacenan de izquierda a derecha o de derecha a izquierda depende de la arquitectura de hardware real. Por otra parte, cada compilador utiliza un modelo de alineación miembro de diferente, por lo que el tamaño de del BillingRec optimizado es de 12 bytes en lugar de 9. No se puede tomar la dirección de un campo poco ni se puede crear un matrices de bits. Finalmente, en la mayoría de las implementaciones , el uso de los campos de bit incurre en una sobrecarga de velocidad. Por lo tanto, cuando optimice su código, mida el efecto de una cierta optimización y sus compensaciones antes de que decida utilizar .

Cuestiones relacionadas