Domanda

Sto scrivendo un linguaggio di programmazione e quando mi sono imbattuto in questa domanda , il mio pensiero immediato era che le lingue dovrebbero ottimizzare i booleani in bit flags per il programmatore. Ciò manterrebbe tutti i vantaggi della velocità e dell'uso efficiente della memoria, eliminando al contempo l'onere della manutenzione e le possibilità di errori causati dalla manipolazione dei bit più complicata.

L'unico caso in cui potresti non voler avere questa ottimizzazione è se hai una situazione in cui è memorizzato un solo set di booleani. Fondamentalmente, se hai 8 bit per flag + maschere 8 bit * 8 bit per maschera bit = 72 bit invece di 8 booleani * 8 bit per booleano = 64 bit . Ma non appena hai anche due copie dei booleani, diventa 2 copie * 8 bit per flag + maschere 8 bit * 8 bit per maschera bit = 80 bit contro 2 copie * 8 booleani * 8 bit per booleano = 128 bit . Sembra che i pochi casi in cui i booleani sarebbero più ottimali per l'archiviazione sarebbero facili da rilevare, quindi non si potrebbe non applicare l'ottimizzazione.

C'è qualche motivo per cui le lingue non supportano questa ottimizzazione? Mi sono guardato intorno e non sembra che ci siano altre lingue (potrei non guardare nei posti giusti).

È stato utile?

Soluzione

Ho visto persone farlo nel linguaggio assembly, in cui racchiudono i booleani in parole per risparmiare spazio, quindi scrivono molte istruzioni per ottenere / impostare i bit.

Chiaramente c'è un compromesso in termini di velocità e memoria tra impacchettare i booleani e non impaccarli, e personalmente sono timido per un compilatore che cerca di decidere questo per me.

Altri suggerimenti

C fa ...

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

quando vengono eseguiti, questi quattro campi vengono impacchettati in un byte:

$ gcc -Wall -o bittest bittest.c 
$ ./bittest 
1
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top