Question

J'écris un langage de programmation et quand je suis tombé sur cette question , ma pensée immédiate était que les langues devraient optimiser les booléens en indicateurs de bits pour le programmeur. Cela permettrait de conserver tous les avantages de la vitesse et de l’utilisation efficace de la mémoire tout en allégeant la maintenance et en évitant les erreurs dues à la manipulation plus complexe des bits.

Si vous ne souhaitez pas utiliser cette optimisation, par exemple, vous ne pouvez enregistrer qu'un seul jeu de booléens. En gros, si vous avez 8 bits pour les drapeaux + masques 8 bits * masque 8 bits par bit = 72 bits au lieu de 8 booléens * 8 bits par booléen = 64 bits . Mais dès que vous avez même deux copies des booléens, cela devient 2 copies * 8 bits pour les drapeaux + masques 8 bits * masque 8 bits par bit = 80 bits contre 2 copies * 8 booléens * 8 bits par booléen = 128 bits . Il semble que les rares cas où les booléens seraient plus optimaux en termes de stockage seraient faciles à détecter et ne pourraient pas appliquer l'optimisation.

Y a-t-il une raison pour laquelle les langues ne prennent pas en charge cette optimisation? J'ai regardé autour de moi et il ne semble pas y avoir de langue (je ne cherche peut-être pas aux bons endroits).

Était-ce utile?

La solution

J'ai vu des gens le faire en langage assembleur, où ils empaquetent des booléens pour économiser de l'espace, puis écrivent de nombreuses instructions pour obtenir / définir les bits.

Il est clair qu’il existe un compromis entre vitesse et mémoire entre emballer des booléens et ne pas les emballer, et personnellement, je suis timide d’un compilateur qui essaie de le décider pour moi.

Autres conseils

C fait ...

#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;
}

lors de l'exécution, ces quatre champs sont regroupés dans un octet:

$ gcc -Wall -o bittest bittest.c 
$ ./bittest 
1
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top