2010-01-15 9 views
6
  • ¿Bitfield es un concepto C o C++?Preguntas sobre C bitfields

  • ¿Se puede usar solo dentro de una estructura? ¿Cuáles son los otros lugares donde podemos usarlos?

  • AFAIK, los campos de bits son variables de estructura especiales que ocupan la memoria solo para el no especificado. de bits. Es útil para guardar memoria y nada más. ¿Estoy en lo correcto?

que codifica un pequeño programa para entender el uso de los campos de bits - Pero, yo creo que no está funcionando como se esperaba. Espero que el tamaño de la siguiente estructura sea de 1 + 4 + 2 = 7 bytes (considerando que el tamaño de int sin firmar es de 4 bytes en mi máquina), pero para mi sorpresa, resulta ser de 12 bytes (4 + 4 + 4) ¿Alguien me puede decir por qué?

#include <stdio.h> 

struct s{ 
unsigned int a:1; 
unsigned int b; 
unsigned int c:2; 
}; 

int main() 
{ 
    printf("sizeof struct s = %d bytes \n",sizeof(struct s)); 
    return 0; 
} 

SALIDA:

sizeof struct s = 12 bytes 

Respuesta

10

Debido a y c no son contiguas, que cada reserva de valor de un int llena de espacio de memoria. Si mueve a y c juntos, el tamaño de la estructura se convierte en 8 bytes.

Además, le está diciendo al compilador que desea que a ocupe solo 1 bit, no 1 byte. Así que aunque a y c uno junto al otro deben ocupar solo 3 bits en total (aún en un solo byte), la combinación de a y c aún se alinea en la memoria en su máquina de 32 bits, ocupando así 4 bytes completos además de la int b.

Del mismo modo, se verá que

struct s{ 
unsigned int b; 
short s1; 
short s2; 
}; 

ocupa 8 bytes, mientras que

struct s{ 
short s1; 
unsigned int b; 
short s2; 
}; 

ocupa 12 bytes ya que en este último caso, los dos cortos cada uno se sienta en su propia alineación de 32 bits .

6

1) Se originaron en C, pero también forman parte de C++, desafortunadamente.

2) Sí, o dentro de una clase en C++.

3) Además de ahorrar memoria, se pueden usar para algunas formas de manipulación de bits. Sin embargo, tanto el almacenamiento de memoria como el twiddling dependen intrínsecamente de la implementación: si desea escribir software portátil, evite los campos de bits.

+0

Para el que menosprecia - ¿con cuáles de estas afirmaciones no está de acuerdo? –

+0

+1: 'implementación dependiente' y 'evitar bitfields' son la clave. –

+0

Aquí estoy parcialmente en desacuerdo con respecto al ahorro de memoria: siéntase libre de especificar campos de bits donde podrían reducir la huella de memoria de una estructura. Pero nunca intentes ser inteligente con ellos y siete veces nunca contarás con lo que el compilador hará con ellos. – dmckee

0

Su C.

Su comiler ha redondeado la asignación de memoria a 12 bytes para fines de alineación. La mayoría de los syubsystems de memoria de la computadora no pueden manejar el direccionamiento de bytes.

+0

quieres decir 'direccionamiento de bit', ¿verdad? – SoapBox

0

Su programa está funcionando exactamente como esperaba. El compilador asigna campos de bits adyacentes en la misma palabra de memoria, pero los tuyos están separados por un campo no bit.

Mueva los campos de bits uno al lado del otro y probablemente obtendrá 8, que es del tamaño de dos en su máquina. Los bitfields se empacarán en un int. Sin embargo, esto es específico del compilador.

Los bitfields son útiles para ahorrar espacio, pero no mucho más.

0

Los campos de bits son ampliamente utilizados en el firmware para mapear diferentes campos en los registros. Esto ahorra muchas operaciones manuales en bits que habrían sido necesarias para leer/escribir campos sin él. Una desventaja es que no puede tomar la dirección de los campos de bits.