Por que o sizeof (bool) não é definido como um, pelo próprio padrão?

Tamanho de char , char signed char e unsigned char é definido como 1 byte, pelo próprio C ++ Standard. Eu estou querendo saber porque não definiu o sizeof(bool) também?

C ++ 03 Standard $ 5.3.3 / 1 diz:

sizeof (char), sizeof (char assinado) e sizeof (unsigned char) são 1; o resultado do tamanho aplicado a qualquer outro tipo fundamental (3.9.1) é definido pela implementação. [Nota: em particular, sizeof (bool) e sizeof (wchar_t) são definidos pela implementação .69)

Eu entendo o raciocínio de que sizeof (bool) não pode ser menor que um byte . Mas existe alguma razão por que deveria ser maior que 1 byte? Não estou dizendo que as implementações definem que seja maior que 1, mas o padrão deixou que ele fosse definido pela implementação como se fosse maior que 1.

Se não houver razão para que o sizeof(bool) seja maior que 1, não entendo por que o padrão não o definiu como apenas 1 byte , já que definiu sizeof(char) e todas as variantes.

Muitas plataformas não podem carregar com eficiência valores menores que 32 bits. Eles precisam carregar 32 bits e usar uma operação de deslocamento e máscara para extrair 8 bits. Você não iria querer isso para bool s único, mas é bom para seqüências de caracteres.

O outro tamanho provável para isso é o de int , sendo o tipo inteiro “eficiente” para a plataforma.

Em arquiteturas onde faz alguma diferença se a implementação escolhe 1 ou sizeof(int) pode haver um trade-off entre size (mas se você está feliz em desperdiçar 7 bits por bool , por que você não ficaria feliz em perder tempo? Use bitfields quando o tamanho é importante versus performance (mas quando armazenar e carregar valores bool vai ser um problema genuíno de desempenho? Use int explicitamente quando a velocidade for importante). Assim, a flexibilidade de implementação vence – se por algum motivo eu fosse atroz em termos de desempenho ou tamanho de código, isso poderia evitá-lo.

Como apontado pelo @MSalters, algumas plataformas trabalham de maneira mais eficiente com itens de dados maiores.

Muitas CPUs “RISC” (por exemplo, MIPS, PowerPC, versões iniciais do Alpha) tiveram / tiveram um tempo consideravelmente mais difícil de trabalhar com dados menores que uma palavra, então eles fazem o mesmo. IIRC, com pelo menos alguns compiladores no Alpha, um bool ocupava 64 bits.

O gcc para PowerPC Macs padronizou o uso de 4 bytes para um bool, mas tinha um switch para mudar isso para um byte se você quisesse.

Mesmo para o x86, há alguma vantagem em usar um item de dados de 32 bits. gcc para o x86 tem (ou pelo menos costumava ter – eu não olhei recentemente) definir em um dos seus arquivos de configuração para BOOL_TYPE_SIZE (indo da memory, então eu poderia ter esse nome um pouco errado) que você poderia definir para 1 ou 4 e, em seguida, re-compilar o compilador para obter um bool desse tamanho.

Edit: Quanto à razão por trás disso, eu diria que é um simples reflexo de uma filosofia básica de C e C ++: deixar tanto espaço para a implementação para otimizar / personalizar seu comportamento como razoável. Exigir um comportamento específico somente quando / se houver um benefício óbvio e tangível, e provavelmente não será uma grande responsabilidade, especialmente se a alteração dificultar substancialmente o suporte a C ++ em alguma plataforma específica (embora, é claro, se a plataforma for suficientemente obscuro, pode ser ignorado).

A operação resultante em ‘sizeof’ é MADUs (minimum addresible unit), não bytes. Então, processadores familiares C54 *. C55 * Texas Instuments, a expressão 1 MADU = 2 bytes.

Para esta plataforma sizeof (bool) = sizeof (char) = 1 MADUs = 2 bytes. Isso não viola o padrão C + +, mas esclarece a situação.

Intereting Posts