O sizeof (bool) está definido no padrão de linguagem C ++?

115

Não consigo encontrar uma resposta na documentação padrão. O padrão de linguagem C ++ exige sizeof(bool)sempre ser 1 (para 1 byte) ou esse tamanho é definido pela implementação?

0xbadf00d
fonte

Respostas:

167

sizeof(bool) é a implementação definida, e o padrão enfatiza este fato.

§5.3.3 / 1, resumido:

sizeof(char), sizeof(signed char)e sizeof(unsigned char)são 1; o resultado de sizeofaplicado a qualquer outro tipo fundamental é definido pela implementação. [Nota: em particular, sizeof(bool)e sizeof(wchar_t)são definidos pela implementação. 69) ]

Nota de rodapé 69):

sizeof(bool) não precisa ser 1.

GManNickG
fonte
existe um sinalizador que eu preciso compilar meu programa, que meu compilador usará apenas 1 byte bool?
Eagle
3
@Eagle: Isso depende do seu compilador, não tenho certeza. Provavelmente é melhor você deixar isso para o seu compilador.
GManNickG
5
observe que std :: vector <bool> é otimizado para um vetor contendo bools de 1 bit pelo padrão.
user3063349
15

http://msdn.microsoft.com/en-us/library/tf4dy80a.aspx

"No Visual C ++ 4.2, os arquivos de cabeçalho C ++ Padrão continham um typedef que equivalia a bool com int. No Visual C ++ 5.0 e posterior, bool é implementado como um tipo interno com um tamanho de 1 byte. Isso significa que para Visual C ++ 4.2, uma chamada de sizeof (bool) produz 4, enquanto no Visual C ++ 5.0 e posterior, a mesma chamada produz 1. Isso pode causar problemas de corrupção de memória se você tiver definido membros de estrutura do tipo bool no Visual C ++ 4.2 e estiver misturando objeto arquivos (OBJ) e / ou DLLs criados com os compiladores 4.2 e 5.0 ou posteriores. "

Yi Ling
fonte
2
Você percebe que isso está um tanto relacionado à pergunta, mas claramente não é uma resposta, já que 0xbadf00d perguntou sobre o padrão, não sobre alguma implementação de compilador específica / selecionada arbitrariamente, certo?
Christopher Creutzig
13
@ChristopherCreutzig É uma prova por contra-exemplo.
kinokijuf
12
@kinokijuf Não é um contra-exemplo. Há muitas coisas no Visual C ++ que não são compatíveis com o padrão.
0xbadf00d
11

Sua implementação está definida. Só sizeof(char)é 1pelo padrão.

Peoro
fonte
2
Por favor, observe que o 1 no padrão pode significar 4 bytes. Então, todo tipo é um produto de 4. Portanto, cuidado que o padrão SÓ define char é o 1, mas não define a medição.
user3063349
1 significa 8 bits ou 1 byte no padrão
paulm
11
1 byte. O número de bits por byte não é definido pelo padrão (precisa ser pelo menos 8 IIRC), mas pode ser encontrado em CHAR_BIT, definido em climits.
peoro
3

Consulte 5.3.3 parágrafo 1:

[Observação: em particular, sizeof (bool) e sizeof (wchar_t) são definidos pela implementação.69)]

BЈовић
fonte