Respostas:
Porque a CPU não pode endereçar nada menor que um byte.
bt
, bts
, btr
e btc
pode enfrentar o bit individual!
bt
endereça um deslocamento de byte e, em seguida, testa o bit em um determinado deslocamento, independentemente, ao especificar um endereço que você digita em bytes ... os literais de deslocamento de bit ficariam um pouco prolixo (desculpe o trocadilho).
Da Wikipedia :
Historicamente, um byte era o número de bits usado para codificar um único caractere de texto em um computador e, por esse motivo, é o elemento endereçável básico em muitas arquiteturas de computadores.
Então, byte é a unidade endereçável básica , abaixo da qual a arquitetura do computador não pode ser endereçada. E como (provavelmente) não existem computadores que suportam byte de 4 bits, você não tem 4 bits, bool
etc.
No entanto, se você pode projetar uma arquitetura que possa endereçar 4 bits como unidade endereçável básica, terá bool
tamanho 4 bits, apenas nesse computador!
int
e char
do meu post.
bool
, porque char
é a menor unidade endereçável em C ++ , independentemente do que a arquitetura possa endereçar com seus próprios opcodes. sizeof(bool)
deve ter um valor de pelo menos 1 e os bool
objetos adjacentes devem ter seus próprios endereços em C ++ , portanto, a implementação precisa apenas torná-los maiores e desperdiçar memória. É por isso que os campos de bits existem como um caso especial: os membros do campo de bits de uma estrutura não precisam ser endereçáveis separadamente, portanto podem ser menores que a char
(embora a estrutura inteira ainda não possa ser).
char
é a menor unidade endereçável em C ++?
sizeof(bool)
não pode ser 0,5 :-) Suponho que uma implementação possa fornecer legalmente ponteiros de sub-bytes como uma extensão, mas objetos "comuns" como bool, alocados de maneiras comuns, precisam fazer o que o padrão diz.
A resposta mais fácil é; é porque a CPU endereça a memória em bytes e não em bits, e as operações bit a bit são muito lentas.
No entanto, é possível usar a alocação de tamanho de bit em C ++. Existe a especialização std :: vector para vetores de bits e também estruturas que recebem entradas de tamanho de bits.
Nos velhos tempos, quando eu tinha que ir para a escola em uma nevasca furiosa, subindo os dois lados, e o almoço era qualquer animal que pudéssemos rastrear na floresta atrás da escola e matar com as próprias mãos, os computadores tinham muito menos memória disponível do que hoje. O primeiro computador que usei tinha 6K de RAM. Não 6 megabytes, não 6 gigabytes, 6 kilobytes. Nesse ambiente, fazia muito sentido agrupar o maior número possível de booleanos em um int e, portanto, usamos regularmente as operações para removê-los e colocá-los.
Hoje, quando as pessoas zombam de você por ter apenas 1 GB de RAM, e o único lugar em que você pode encontrar um disco rígido com menos de 200 GB é em uma loja de antiguidades, não vale a pena arrumar os bits.
Você pode ter bools de 1 bit e ints de 4 e 2 bits. Mas isso criaria um conjunto de instruções estranho, sem ganho de desempenho, porque é uma maneira não natural de olhar para a arquitetura. Na verdade, faz sentido "desperdiçar" uma parte melhor de um byte, em vez de tentar recuperar esses dados não utilizados.
O único aplicativo que se preocupa em compactar vários bools em um único byte, na minha experiência, é o Sql Server.
Você pode usar campos de bits para obter números inteiros de tamanho inferior.
struct X
{
int val:4; // 4 bit int.
};
Embora seja geralmente usado para mapear estruturas para exatos padrões de bits esperados por hardware:
struct SomThing // 1 byte value (on a system where 8 bits is a byte
{
int p1:4; // 4 bit field
int p2:3; // 3 bit field
int p3:1; // 1 bit
};
bool
pode ter um byte - o menor tamanho endereçável da CPU ou pode ser maior. Não é incomum ter bool
que ter esse tamanho int
para fins de desempenho. Se, para fins específicos (por exemplo, simulação de hardware), você precisar de um tipo com N bits, poderá encontrar uma biblioteca para isso (por exemplo, a biblioteca GBL tem BitSet<N>
classe). Se você está preocupado com o tamanho de bool
(você provavelmente tem um contêiner grande), pode embalar os bits por conta própria ou usá- std::vector<bool>
lo para fazer isso por você (tenha cuidado com o último, pois ele não atende aos requisitos do contêiner).
Porque, em geral, a CPU aloca memória com 1 byte como unidade básica, embora algumas CPUs como MIPS usem uma palavra de 4 bytes.
No entanto, vector
trata de bool
maneira especial, com vector<bool>
um bit para cada bool é alocado.
lw
/ sw
são muito mais amplamente usadas.
O byte é a unidade menor de armazenamento de dados digitais de um computador. Em um computador, a RAM possui milhões de bytes e qualquer um deles possui um endereço. Se ele tivesse um endereço para cada bit, um computador poderia gerenciar 8 vezes menos RAM do que aquilo que pode.
Mais informações: Wikipedia
Mesmo quando o tamanho mínimo possível é 1 Byte, você pode ter 8 bits de informações booleanas em 1 Byte:
http://en.wikipedia.org/wiki/Bit_array
A linguagem Julia possui o BitArray, por exemplo, e eu li sobre implementações em C ++.
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
. A maioria dos compiladores alocará um totalunsigned int
, no entanto, eles lidam com a manipulação de bits quando você lê / escreve. Também eles lidam sozinhos com as operações do módulo. Isso é umunsigned small : 4
atributo tem um valor entre 0 e 15, e quando deve chegar a 16, não vai substituir o bit anterior :)