2012-01-17 8 views
5

me encontré con esta sintaxis que no he visto antesC++ especificando la longitud de datos con la declaración de tipo de datos

struct A { 
    int x:24; 
}; 

¿Qué x: 24 significa? En C++, ¿puede especificar el compilador de que una variable debe ocupar solo 24 bits, en lugar de 32 para un tipo int? En caso afirmativo, ¿qué 24 bits se ocuparán? el más a la izquierda o el más a la derecha?

+0

x sería una int muy curiosa si fuera la parte MSB de un sistema estándar int. –

Respuesta

6

Este es el bit fields feature. Ha estado disponible desde los primeros C días. Microsoft tiene a nice write-up on this feature, completo con bonitas imágenes que muestran el diseño que es específico del compilador (dicen que la imagen es específica de MS).

+2

unsigned: 0; Es una característica interesante que no me había dado cuenta antes. –

+0

Pero tenga en cuenta que las imágenes bonitas solo describen cómo Microsoft decidió implementarlo; en general, el diseño es implementación definida. –

+0

@MikeSeymour Tiene toda la razón: este fue el tema de mi edición. – dasblinkenlight

4

Esto es exactamente lo que usted piensa que es, llamado bit campo. x tiene 24 bits disponibles.

// standard 32bit integer: 
0000 0000 0000 0000 0000 0000 0000 0000 
// x (24 bit): 
0000 0000 | 0000 0000 0000 0000 0000 0000 
//  ^-- cut off here 
// other 8 bit available for other uses, for example: 

struct A{ 
    int x : 24; 
    int y : 8; 
}; // sizeof(A) == sizeof(int) (most likely on 32bit architecture) 

Tenga en cuenta que la estructura seguirá siendo de 32 bits (o 4 bytes) grande, ya que no sólo puede matar los que el exceso de bits. Como tal, los campos de bit son principalmente útiles cuando tiene requisitos de espacio muy estrecho y necesita empacar la mayor cantidad de información posible en el menor espacio posible.

+0

Si le gustaría elaborar con una suposición; ¿La implementación del compilador es una máscara + cambio de bits en estos escenarios? (bitshift) –

+1

@ CapitánGiraffe: lo más probable. En el nivel de hardware, no se pueden separar las palabras de ninguna otra forma IIRC. Es interesante observar, sin embargo, que cualquier desbordamiento de un campo de bit no afecta a ningún otro campo de bit (si 'x' se desbordara,' y' no cambiaría) (aparte del hecho de que en este caso, el desbordamiento sería comportamiento indefinido porque 'x' está firmado ...). – Xeo

+0

En su ejemplo anterior, ¿habrá un relleno después de int x: 24 para mantener el int alineado a 32 bits o los 8 bits restantes de la variable x, utilizados para completar el valor de la variable Y? – Jimm

4

En caso afirmativo, ¿qué 24 bits se ocuparán? el más a la izquierda o el más a la derecha?

Es no especificado en el estándar de C++ (§9.6/1: campos de bits se asignan de derecha a izquierda en algunas máquinas, de izquierda a derecha en otros).

Por lo general, depende de la endianidad de la plataforma. En una plataforma ascendente hacia la izquierda que se llenaría como:

[ bits 0~7 ] [ bits 8~15 ] [ bits 16~23 ] [ bits 24~31 ] 
----------------------------------------- -------------- 
        x       (padding) 

y se invierte en la plataforma big-endian

[ bits 0~7 ] [ bits 8~15 ] [ bits 16~23 ] [ bits 24~31 ] 
------------ ------------------------------------------- 
    (padding)      x 
+0

¿Cómo alinea el compilador una estructura con campos de bit? ¿Simplemente rellenará suficientes bits en el extremo de la estructura, de modo que esté alineado en 32 bits para una plataforma de 32 bits? ¿Qué ocurre si una estructura tiene un campo de bit como int x: 8 y otro campo regular int y; ¿Dónde se aplicaría el relleno en este ejemplo? – Jimm

+0

@Jimm: Puede ver el [enlace] (http://msdn.microsoft.com/en-us/library/ewwyfdbe%28v=vs.100%29.aspx) proporcionado por [@dasblinkenlight] (http://stackoverflow.com/a/8900155/224671) – kennytm

1

La ordenación de bits sería dependiente de la CPU. Tal vez podrías escribir algo simple como 1 en este campo y luego mirar la palabra de memoria en el depurador.

+0

Me imagino que el compilador estaría haciendo el trabajo pesado aquí, no la CPU. –

Cuestiones relacionadas