2010-07-06 28 views
36

Duplicar posible:
What does ‘unsigned temp:3’ meansEn C, ¿qué significa dos puntos dentro de una declaración?

estoy aprendiendo algo de código del kernel, y llegó a lo largo de la línea siguiente (en Linux 2.4, sched.h, struct mm_struct):

unsigned dumpable:1; 

¿Qué significa esto?

+0

trinary es la base tres. Querías decir ternario, y aunque es el único operador ternario, como dice John, ese no es su nombre. –

+0

Gracias, aprecio estas correcciones. Eliminé esa línea por completo de mi pregunta porque no era relevante. – Tzafrir

+4

Creo que la etiqueta de dos puntos debe permanecer en esta pregunta, ya que otros podrían, como yo, usar esa palabra para intentar averiguar qué significa esto antes de preguntar. – Tzafrir

Respuesta

53

Es un miembro bitfield. Su código significa dumpable ocupa exactamente 1 bit en la estructura.

Los campos de bits se utilizan cuando desea empaquetar miembros en el nivel de bit. Esto puede reducir en gran medida el tamaño de la memoria utilizada cuando hay muchos indicadores en la estructura. Por ejemplo, si definimos una estructura que tiene 4 miembros con limitación numérica conocida

0 < a < 20 
    b in [0, 1] 
0 < c < 8 
0 < d < 100 

entonces el struct podría ser declarado como

struct Foo { 
    unsigned a : 5; // 20 < 2^5 = 32 
    unsigned b : 1; // 
    unsigned c : 3; // 
    unsigned d : 7; // 100 < 2^7 = 128 
}; 

entonces los bits de Foo pueden estar dispuestos como

     ddddddd c cc b aaaaa 
--------- --------- --------- ---------- 
         octet 1  octet 0 
=========================================== 
       uint32 

en lugar de

struct Foo { 
    unsigned a; 
    unsigned b; 
    unsigned c; 
    unsigned d; 
}; 

en el que muchos bits se desperdicia debido a la gama de valores

# wasted space which is not used by the program 
# v          v 
          ddddddd         ccc 
------------------------------------ ------------------------------------ 
      uint32         uint32 


            b        aaaaa 
------------------------------------ ------------------------------------ 
      uint32         uint32 

lo que puede ahorrar espacio por el embalaje de muchos miembros juntos.

Tenga en cuenta que el estándar C no especifica cómo se arreglan o empaquetan los campos de bits en una "unidad de almacenamiento direccionable". Además, los campos de bits son más lentos en comparación con el acceso directo de miembros.

+5

¡Gracias por una gran respuesta! Vale la pena señalar explícitamente, por el lector casual, que la implementación de estos campos de bits no solo depende de la máquina, sino también del compilador, y el código que utiliza supuestos sobre la ubicación de estos bits en la memoria es muy poco práctico. – Tzafrir

+1

el estándar C99 define que los campos de bits se colocan uno junto al otro cuando hay suficiente espacio disponible. "Una implementación puede asignar cualquier unidad de almacenamiento direccionable lo suficientemente grande como para contener un campo de bits. Si queda suficiente espacio, un campo de bits que sigue inmediatamente a otro campo de bits en una estructura se empaquetará en bits adyacentes de la misma unidad". – waynix

5

Significa que es un campo de bits, es decir, el tamaño de dumpable es un bit único, y solo puede asignarle 0 o 1. Normalmente se usa en código antiguo para ahorrar espacio, o en código de bajo nivel que interactúa con el hardware (aunque el embalaje no es portátil). Consulte here para obtener más información

+0

El embalaje no es necesariamente como parece indicar correctamente. A menudo, los campos de bits están alineados en límites de 4 bytes. Sin embargo, hay opciones de compilación que influyen en esto. – GorillaPatch

3

Si no recuerdo mal, cuando se utiliza dentro de una estructura, el número después de dos puntos indica cuántos bits componen la variable (o un campo de bits).

Por lo tanto, unsigned dumpable:1; es un bitfield de bit único.

Cuestiones relacionadas