En C, ¿qué significan dos puntos dentro de una declaración? [duplicate]

3 minutos de lectura

avatar de usuario
Tzafrir

Posible duplicado:

¿Qué significa ‘temp sin firmar: 3’?

Estoy aprendiendo algo del código del kernel y encontré la siguiente línea (en Linux 2.4, sched.h, struct mm_struct):

unsigned dumpable:1;

¿Qué significa esto?

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

    –Pete Kirkham

    6 de julio de 2010 a las 12:13

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

    – Tzafrir

    6 de julio de 2010 a las 12:21

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

    – Tzafrir

    6 de julio de 2010 a las 12:23


avatar de usuario
kennytm

Es un campo de bits miembro. Tu código significa dumpable ocupa exactamente 1 bit en la estructura.

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

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

entonces la estructura podría declararse como

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

luego los pedacitos de Foo mayo ser arreglado como

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

en vez de

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

en el que se desperdician muchos bits debido al rango de valores

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


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

para que pueda ahorrar espacio empaquetando muchos miembros juntos.

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

  • ¡Gracias por una gran respuesta! Vale la pena señalar explícitamente, por el bien del 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 usa suposiciones sobre la ubicación de estos bits en la memoria es altamente imposible de transportar.

    – Tzafrir

    6 de julio de 2010 a las 12:49

  • el estándar C99 define que los campos de bits se colocan uno al lado del 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

    8 de abril de 2013 a las 12:27


Significa que es un campo de bits, es decir, el tamaño del volcado es de un solo bit, 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 paquete no sea portátil). Ver aquí para más información

  • El embalaje no es necesariamente lo que parece, como usted señala correctamente. A menudo, los campos de bits se alinean en límites de 4 bytes. Sin embargo, hay opciones del compilador que influyen en esto.

    – parche de gorila

    6 de julio de 2010 a las 12:24

avatar de usuario
justin niessner

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

Asi que unsigned dumpable:1; es un campo de bits de un solo bit.

¿Ha sido útil esta solución?