Preguntas sobre campos de bits C

4 minutos de lectura

Preguntas sobre campos de bits C
Aks

  • ¿Bitfield es un concepto de C o C++?

  • ¿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 especial que ocupan la memoria solo para el número especificado. de bits Es útil para ahorrar memoria y nada más. ¿Estoy en lo correcto?

Codifiqué un pequeño programa para comprender el uso de los campos de bits, pero creo que no funciona como se esperaba. Espero que el tamaño de la siguiente estructura sea 1+4+2 = 7 bytes (considerando que el tamaño de int sin firmar es 4 bytes en mi máquina), pero para mi sorpresa resulta ser 12 bytes (4+4+4 ). ¿Alguien puede decirme 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;
}

PRODUCCIÓN:

sizeof struct s = 12 bytes 

Porque a y c no son contiguos, cada uno reserva un valor completo de espacio de memoria. si te mueves a y c juntos, el tamaño de la estructura se convierte en 8 bytes.

Además, le estás diciendo al compilador que quieres a para ocupar solo 1 poco, no 1 byte. Así que aunque a y c uno al lado del otro debe ocupar solo 3 bits en total (todavía bajo un solo byte), la combinación de a y c todavía se alinea con las palabras en la memoria de su máquina de 32 bits, por lo que ocupa 4 bytes completos además del int b.

Del mismo modo, encontraría 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 porque en el último caso, los dos cortos se sientan cada uno en su propia alineación de 32 bits.

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

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

3) Además de ahorrar memoria, se pueden usar para algunas formas de jugar con los bits. Sin embargo, tanto el ahorro de memoria como el giro son inherentemente dependientes de la implementación: si desea escribir software portátil, evite los campos de bits.

  • Para el votante negativo, ¿con cuál de estas afirmaciones no está de acuerdo?

    luego

    15 de enero de 2010 a las 12:11

  • +1: ‘depende de la implementación’ y ‘evitar campos de bits’ son clave.

    – David Rodríguez – dribeas

    15 de enero de 2010 a las 13:50

  • Estaré parcialmente en desacuerdo aquí 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 cuentes con lo que el compilador hará con ellos.

    – dmckee — gatito ex-moderador

    16 de enero de 2010 a las 3:17

  • Siempre que el tipo base del campo de bits sea un tipo sin signo, las propiedades aritméticas del campo de bits están bien definidas y son las mismas en todas partes. Por ejemplo, si tienes un unsigned x : 4; campo de bits, luego los cálculos en x siempre se hacen módulo 16.

    – café

    17 de enero de 2010 a las 23:16

  • En el código incrustado, los campos de bits suelen ser vitales para escribir un código eficiente, por ejemplo, alternar bits en un puerto de salida asignado a la memoria. El puerto se define como un campo de bit y los pines de puerto individuales se controlan estableciendo el valor de bit en 1 o 0. Esto hace que el código sea fácil de mantener. Las asignaciones de puertos de hardware se pueden modificar en 1 lugar en el código. Si el procesador tiene instrucciones de manipulación de bits (muchos las tienen), es probable que el compilador las use. La alternativa es utilizar máscaras con una operación AND/OR. Esto es más difícil de mantener, menos legible y es probable que produzca un código menos eficiente.

    – usuario1582568

    21 de diciembre de 2015 a las 20:42

Es C.

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

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 que no es de bits.

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

Los campos de bits son útiles para ahorrar espacio, pero no mucho más.

1647665646 191 Preguntas sobre campos de bits C
Parshuram Thombare

Los campos de bits se usan ampliamente en el firmware para mapear diferentes campos en los registros. Esto ahorra muchas operaciones manuales bit a bit 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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad