Em C ++, estou me perguntando por que o tipo bool tem 8 bits de comprimento (no meu sistema), onde apenas um bit é suficiente para armazenar o valor booleano?
Eu costumava acreditar que era por motivos de desempenho, mas em uma máquina de 32 bits ou 64 bits, onde os registros têm 32 ou 64 bits de largura, qual é a vantagem de desempenho?
Ou é apenas uma dessas razões "históricas"?
sizeof(bool)
seria 4. Eu poderia jurar que o msvc tinha bools de 32 bits, mas tentei e não.vector<bool>
não é que ele tenta ser inteligente e empacota bools em bits, mas que tenta fazer isso e se disfarçar como um contêiner STL . Um conjunto de bits simples ficaria bem desde que também não pretendesse ser um contêiner STL.bool
tipo de dados C ++ com oBOOL
tipo do Windows ao qual é digitado o tipolong
. Entãosizeof(bool) != sizeof(BOOL)
, o que tenho certeza causa muita confusão (e provavelmente um bom número de bugs). Especialmente porque também existemboolean
eBOOLEAN
typedefs no Windows, que são aliases paraunsigned char
. Além disso, observe que, embora seja comumbool
ter 1 byte, o padrão C ++ possui uma observação que indica especificamente quesizeof(bool)
pode ser maior.Respostas:
Porque todo tipo de dados C ++ deve ser endereçável.
Como você criaria um ponteiro para um único bit? Você não pode. Mas você pode criar um ponteiro para um byte. Portanto, um booleano em C ++ geralmente é do tamanho de bytes. (Também pode ser maior. Depende da implementação. O principal é que ele deve ser endereçável, para que nenhum tipo de dados C ++ possa ser menor que um byte)
fonte
A memória é endereçável em bytes. Você não pode endereçar um único bit, sem mudar ou mascarar a leitura de bytes da memória. Eu imagino que essa seja uma razão muito grande.
fonte
Um
boolean
tipo normalmente segue a menor unidade de memória endereçável da máquina de destino (ou seja, geralmente o byte de 8 bits).O acesso à memória está sempre em "partes" (várias palavras, isto é para eficiência no nível do hardware , transações de barramento): um bit booleano não pode ser endereçado "sozinho" na maioria dos sistemas de CPU. Obviamente, uma vez que os dados estão contidos em um registro , muitas vezes há instruções especializadas para manipular os bits independentemente.
Por esse motivo, é bastante comum usar técnicas de "empacotamento de bits" para aumentar a eficiência no uso de tipos de dados base "booleanos". Uma técnica como
enum
(em C) com potência de 2 códigos é um bom exemplo. O mesmo tipo de truque é encontrado na maioria dos idiomas.Atualizado : graças a uma excelente discussão, foi trazido à minha atenção que,
sizeof(char)==1
por definição, em C ++. Portanto, o endereçamento de um tipo de dados "booleano" está bastante vinculado à menor unidade de memória endereçável (reforça meu argumento).fonte
bool
tipo segue a menor unidade de memória alocável porque o C ++ exige que seja possível criar ponteiros para ele . Sem esse requisito, umbool
poderia ter sido representado como um bit único, mesmo em máquinas atuais endereçáveis por bytes.sizeof(char)==1 definition
esse é o melhor contra-argumento para a minha argumentação. Obrigado!As respostas sobre 8 bits sendo a menor quantidade de memória endereçável estão corretas. No entanto, alguns idiomas podem usar 1 bit para booleanos, de certa forma. Eu me lembro do Pascal implementando conjuntos como cadeias de bits. Ou seja, para o seguinte conjunto:
Você pode ter isso na memória:
Obviamente, você pode fazer algo semelhante em C / C ++, se quiser. (Se você está acompanhando um monte de booleanos, isso pode fazer sentido, mas realmente depende da situação.)
fonte
vector
. Na verdade, não é um contêiner do tipo STL, porque há restrições no comportamento. O pior é que isso causa problemas com alguém que tem sebool
e quer fazer umvector
deles. É um comportamento surpreendente, e não é isso que você deseja em um idioma.Eu sei que isso é velho, mas eu pensei em jogar meus 2 centavos.
Se você limitar seu tipo booleano ou de dados a um bit, seu aplicativo estará em risco de interrupção da memória. Como você lida com estatísticas de erro na memória de apenas um bit?
Fui a uma entrevista de emprego e uma das declarações que o líder do programa me disse foi: "Quando enviamos o sinal para lançar um míssil, enviamos apenas um bit on off off via wireless. O envio de um bit é extremamente rápido e nós precisa que esse sinal seja o mais rápido possível ".
Bem, foi um teste para ver se eu entendi os conceitos e bits, bytes e manipulação de erros. Quão fácil seria para um bandido enviar uma mensagem de um bit. Ou o que acontece se durante a transmissão o bit for invertido para o outro lado.
fonte
bool
usa 8 bits na máquina do OP e 32 na minha, pois os outros 7 ou 31 bits certamente não são usados para nenhuma "estatística de erro". Isso não faz sentidoAlguns compiladores incorporados possuem um tipo int1 que é usado para compactar bit boolean flags (por exemplo, série CCS de compiladores C para MPUs de Microchip). A configuração, limpeza e teste dessas variáveis usam instruções de nível de bit de instrução única, mas o compilador não permitirá outras operações (por exemplo, pegar o endereço da variável), pelos motivos mencionados em outras respostas.
fonte