Uso eficiente de memoria con campos de bits en C
Supongamos que tu programa C contiene variables VERDADERO/FALSO agrupadas en una estructura status:
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status;
Esta estructura requiere 8 bytes, pero realmente solo almacenamos 0 o 1 en cada variable. C ofrece mejor forma de utilizar memoria en estos casos.
Si usas tales variables dentro de una estructura, puedes definir el ancho (número de bits) que usará cada variable. La estructura anterior se reescribe así:
struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status;
Ahora requiere 4 bytes para status, pero solo 2 bits se usan para almacenar valores.
Si usas hasta 32 variables cada una con ancho 1 bit, la estructura sigue usando 4 bytes. Con 33 variables, asigna el siguiente slot y usa 8 bytes. Ejemplo para entender el concepto:
Demo en vivo#include <stdio.h>
#include <string.h>
/* estructura simple */
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status1;
/* estructura con campos de bits */
struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status2;
int main() {
printf("Memoria ocupada por status1: %d\n", sizeof(status1));
printf("Memoria ocupada por status2: %d\n", sizeof(status2));
return 0;
}
Resultado:
Memoria ocupada por status1: 8 Memoria ocupada por status2: 4
Declaración de campo de bits
La declaración dentro de una estructura tiene la forma:
struct {
tipo [nombre_miembro] : ancho;
};
Elementos de un campo de bits:
| Nº | Elemento y Descripción |
|---|---|
| 1 | tipo Tipo entero que determina cómo se interpreta el valor del campo. Puede ser int, signed int, unsigned int. |
| 2 | nombre_miembro Nombre del campo de bits. |
| 3 | ancho Número de bits en el campo. Debe ser <= ancho en bits del tipo especificado. |
Las variables con ancho predefinido se llaman campos de bits. Pueden contener más de un bit; ej. para almacenar 0-7, necesitas 3 bits:
struct {
unsigned int edad : 3;
} Edad;
Esto indica al compilador que edad usa solo 3 bits. Si intentas usar más de 3 bits, no lo permitirá. Ejemplo:
#include <stdio.h>
#include <string.h>
struct {
unsigned int edad : 3;
} Edad;
int main() {
Edad.edad = 4;
printf("Sizeof(Edad): %d\n", sizeof(Edad));
printf("Edad.edad: %d\n", Edad.edad);
Edad.edad = 7;
printf("Edad.edad: %d\n", Edad.edad);
Edad.edad = 8; /* fuera de rango 0-7 */
printf("Edad.edad: %d\n", Edad.edad);
return 0;
}
Compila con advertencia y al ejecutar:
Sizeof(Edad): 4 Edad.edad: 4 Edad.edad: 7 Edad.edad: 0
Lenguaje C
- Dominando operadores bit a bit y de desplazamiento en C#: Guía completa
- Cuatro patrones probados para funciones definidas por el usuario en C
- Cómo pasar arrays 1D y 2D a funciones en C – Guía práctica
- Dominando structs y punteros en C: Guía práctica
- Structs en C++ explicados con un ejemplo práctico
- Dominando funciones en C: Estructura, declaración y mejores prácticas
- Dominando Argumentos Variables en C: Guía Práctica
- Métodos en C#: Definición, llamada y uso de funciones
- Integración en MATLAB: Antiderivadas, Integrales Definidas y Sumas de Riemann
- Palabra clave this en Java: Usos prácticos, constructores y más
- Dominando la encapsulación en Java: Guía práctica de ocultamiento de datos