Pregunta

Estoy escribiendo un lenguaje de programación, y cuando me topé con esta pregunta , mi pensamiento inmediato fue que los lenguajes deberían optimizar los booleanos en banderas de bits para el programador. Esto mantendría todos los beneficios de la velocidad y el uso eficiente de la memoria, a la vez que eliminaría la carga del mantenimiento y las posibilidades de errores causados ??por la manipulación de bits más complicada.

El único caso en el que puede desear no tener esta optimización es si tiene una situación en la que solo se almacena un conjunto de booleanos. Básicamente, si tiene 8 bits para banderas + 8 bits máscaras * 8 bits por bit máscara = 72 bits en lugar de 8 booleanos * 8 bits por booleano = 64 bits . Pero tan pronto como tienes dos copias de los booleanos, se convierte en 2 copias * 8 bits para banderas + 8 bits máscaras * 8 bits por bit máscara = 80 bits frente a 2 copias * 8 booleanos * 8 bits por booleano = 128 bits . Parece que los pocos casos en los que los booleanos serían más óptimos de almacenamiento serían fáciles de detectar, por lo que uno podría no aplicar la optimización.

¿Hay alguna razón por la que los idiomas no admitan esta optimización? Miré a mi alrededor y no parece que lo haga ningún idioma (es posible que no esté buscando en los lugares correctos).

¿Fue útil?

Solución

He visto a personas hacer esto en lenguaje ensamblador, donde agrupan booleanos en palabras para ahorrar espacio y luego escriben muchas instrucciones para obtener / configurar los bits.

Claramente, hay un compromiso entre la velocidad y la memoria entre empacar booleanos y no empacarlos, y personalmente me da miedo que un compilador intente decidir eso por mí.

Otros consejos

C hace ...

#include <stdio.h>

typedef struct foo_s {
    unsigned char field1 :1;
    unsigned char field2 :1;
    unsigned char field3 :4;
    unsigned char field4 :2;
} foo_t;

int main() {
    printf("%d\n", sizeof(foo_t));
    return 0;
}

cuando se ejecutan, esos cuatro campos se empaquetan en un byte:

$ gcc -Wall -o bittest bittest.c 
$ ./bittest 
1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top