Por que um valor booleano é armazenado como um byte dentro de um computador quando requer apenas um bit

32

Recentemente, comecei a aprender a escrever código e, no meu livro, me deparei com essa pergunta. "Por que um valor booleano é armazenado como um byte dentro de um computador quando requer apenas um bit?" alguém pode lançar mais luz sobre essa questão?

Mr. 1.0
fonte
10
Isso não é estritamente falando verdade. Algumas linguagens (como C / C ++) fornecem maneiras de armazenar valores booleanos como bits únicos, se esses bits estiverem agrupados em um único byte. Em outras palavras, em C, você pode armazenar oito booleanos em um byte. Porém, poucos usam isso, pois a memória é barata e os processadores manipulam dados em pedaços de 8/16/32/64 bits.
Gort the Robot
Esta resposta a uma pergunta semelhante é o que você deve ver! Você terá uma referência enorme lá ... Saúde!
Sam
2
Duplicar de stackoverflow.com/questions/14220726/one-byte-bool-why
Stop Harming Monica
Intimamente relacionados: stackoverflow.com/questions/8014161/...
Ben Lee

Respostas:

49

Tem a ver com o que a CPU pode resolver facilmente. Por exemplo, em um processador x86, há um eax(32 bits), ax(16 bits) e um ah(8 bits), mas nenhum registro de bit único. Portanto, para usar um único bit, a CPU precisará fazer uma leitura / modificação / gravação para alterar o valor. Se estiver armazenado como um byte, uma única leitura ou gravação poderá ser usada para inspecionar / alterar o valor.

Além disso, pode-se perguntar se seria melhor usar um único bit versus um byte completo, afinal um byte estará desperdiçando 7 bits. A menos que o espaço seja uma restrição que se deve procurar pelo byte, porque, pelo menos o x86 e acho que outros, geralmente há instruções para definir / limpar rapidamente um bool muito mais rápido que a leitura / modificação / gravação de um único bit . Em medições pessoais, vi o método de leitura / modificação / gravação ser 5 vezes mais lento que o método de instrução única.

barrem23
fonte
6
A única palavra que está faltando é "Alinhamento dos limites".
Manoj R
3
Por outro lado, eu vi uma aceleração de 2x usando bits individuais, provavelmente devido ao melhor uso do cache com um conjunto de dados menor.
Michael Borgwardt
5

Como o @ barrem23 explica , os dados devem ser endereçáveis e o menor limite nas arquiteturas convencionais é um byte.

Mas, como essa pergunta está marcada como , vale a pena ressaltar que std::vector<bool>é especializada para permitir que elementos individuais sejam armazenados como bits . Isso economizará espaço sacrificando algumas funcionalidades (por exemplo, std::searchpode não funcionar).

chrisaycock
fonte