Caracteristicas do idioma:otimizando booleanos para flags + bitmasks
-
05-07-2019 - |
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).
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