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?
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
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.
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