Pergunta

Estou escrevendo uma linguagem de programação e quando me deparei essa questão, meu pensamento imediato foi que as linguagens deveriam otimizar booleanos em sinalizadores de bits para o programador.Isso manteria todos os benefícios da velocidade e do uso eficiente da memória, ao mesmo tempo que eliminaria a carga de manutenção e as possibilidades de erros causados ​​pela manipulação mais complicada de bits.

O único caso em que você pode querer não ter essa otimização é se você tiver uma situação em que haja apenas um conjunto de booleanos sendo armazenado.Basicamente, se você tiver 8 bits for flags + 8 bit masks * 8 bits per bit mask = 72 bits em vez de 8 booleans * 8 bits per boolean = 64 bits.Mas assim que você tiver pelo menos duas cópias dos booleanos, torna-se 2 copies * 8 bits for flags + 8 bit masks * 8 bits per bit mask = 80 bits contra 2 copies * 8 booleans * 8 bits per boolean = 128 bits.Parece que os poucos casos em que os booleanos seriam mais ideais para armazenamento seriam fáceis de detectar, então seria possível não aplique a otimização.

Existe algum motivo para os idiomas não suportarem essa otimização?Olhei em volta e não parece que nenhum idioma o faça (posso não estar procurando nos lugares certos).

Foi útil?

Solução

Já vi pessoas fazerem isso em linguagem assembly, onde empacotam booleanos em palavras para economizar espaço e depois escrevem muitas instruções para obter/definir os bits.

Claramente, há uma compensação em velocidade e memória entre empacotar booleanos e não empacotá-los, e pessoalmente tenho vergonha de um compilador tentar decidir isso para mim.

Outras dicas

C faz...

#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 executado, esses quatro campos são compactados em um byte:

$ gcc -Wall -o bittest bittest.c 
$ ./bittest 
1
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top