Pergunta

Por que um booleano consome 4 bytes e um char 2 bytes no .NET framework? Um valor booleano deve ocupar 1bit ou pelo menos ser menor do que um char.

Foi útil?

Solução

É uma questão de alinhamento de memória. variáveis ??de 4 bytes trabalhar mais rápido do que os 2 bytes. Esta é a razão pela qual você deve usar int em vez de byte ou curto para contadores e afins.

Você deve usar variáveis ??de 2 bytes somente quando a memória é uma preocupação maior do que a velocidade. E esta é a razão pela qual char (que é Unicode em .NET) leva dois bytes em vez de quatro.

Outras dicas

Sobre boolean

A maioria das outras respostas errar - o alinhamento ea velocidade é por isso que um programador deve ficar para int para contadores de loop, não por que o compilador pode fazer um byte ser de 4 bytes de largura. Todos os seus raciocínios, de fato, se aplicam a byte e curto, bem como booleano.

Em C #, pelo menos, bool (ou System.Boolean) é um 1 byte de largura builtin estrutura, que pode ser encaixotado automaticamente, então você tem um objeto (que precisa de duas palavras de memória a ser representados, pelo menos, ou seja, 8/16 bytes em bits de ambientes 32/64, respectivamente) com um campo (pelo menos um byte) além de uma palavra de memória para apontar para ele, ou seja, no total, pelo menos 13/25 bytes.

Isso é de fato a primeira entrada do Google em "C # tipos primitivos". http://msdn.microsoft.com/en-us/ biblioteca / ms228360 (VS.80) .aspx

Também o link citado ( http://geekswithblogs.net/cwilliams /archive/2005/09/18/54271.aspx ) também afirma que um booleano, pelo padrão CLI, leva 1 byte.

Na verdade, no entanto, o único lugar onde isso é visível está em matrizes de booleanos - n booleans levaria n bytes. Nos outros casos, um boolean pode levar 4 bytes.

  • dentro de uma estrutura, a maioria dos tempos de execução (também em Java) iria alinhar todos os campos para um limite de 4 bytes para o desempenho. O Monty JVM para dispositivos embarcados é mais sábio - Eu acho que reordena os campos de forma otimizada.
    • No local, frame / operando pilha para o intérprete, na maior implementação, para o desempenho, uma entrada pilha é uma memória de palavra grande (e talvez em .NET deve ser de 64 bits de largura para suportar o dobro e longo, que em .NET usa apenas 1 pilha entrada em vez de 2 em Java). Um compilador JIT pode sim usar 1 byte para moradores boolean, mantendo outros vars alinhados reordenando campos sem impacto no desempenho, se a sobrecarga adicional vale a pena.

Sobre char

char são dois bytes, porque quando é necessário apoio à internacionalização, usando caracteres de dois bytes internamente é a aposta mais segura. Isso não está relacionado diretamente ao escolher para apoiar Unicode, mas para a escolha de vara para UTF-16 e para o Plano Multilingual Básico. Em Java e C #, você pode assumir todo o tempo que se encaixa de char lógicos em uma variável do tipo char.

Isso porque em um ambiente de 32 bits, a CPU pode lidar com valores de 32 bits mais rápido do que os valores de 8 bits ou 16 bits, por isso esta é uma troca de velocidade / tamanho. Se você tem que salvar a memória e você tem uma grande quantidade de bools, use apenas uint S e salvar o seu booleans como os bits de 4 byte uint s. Caracteres são 2 bytes de largura, uma vez que armazenar caracteres Unicode de 16 bits.

Independentemente da pequena diferença no armazenamento de memória, usando booleana para os verdadeiros / falsos valores sim / não é importante para os desenvolvedores (incluindo você, quando você tem que rever o código de um ano mais tarde), porque ele reflete com mais precisão a sua intenção. Fazendo o seu código mais compreensível é muito mais importante do que salvar dois bytes.

Fazendo seu código de forma mais precisa refletir a sua intenção também reduz a probabilidade de que alguma otimização compilador irá ter um efeito negativo. Este conselho plataformas transcende e compiladores.

Você também deve usar boolean ao código maintanable ajudar a escrever. Se eu estou olhando para código vendo que algo é um boolean é mais do que vale a economia de memória para descobrir o que o seu utilizando carvão como booleans.

Eu encontrei esta: "Na verdade, um booleano é de 4 bytes, não 2. A razão é que isso é o que os suportes CLR para booleana eu acho que é o que ele faz, porque 32 bit valores são muito mais eficientes de manipular, de forma a. tempo / tradeoff espaço é, em geral, vale a pena. você deve usar a classe pouco vetor (esquecer de onde é) se você precisa para jam um monte de pedaços juntos ... "

É escrito por Paul Wick em http://geekswithblogs.net /cwilliams/archive/2005/09/18/54271.aspx

Em primeiro lugar você deve usar um profiler para determinar onde você tem problema de memória, IMHO.

A memória é apenas uma preocupação se você tem uma grande variedade de bits, caso em que você pode usar a classe System.Collections.BitArray.

Seu porque o Windows e .Net usaram Unicode (UTF-16) desde o início como seu conjunto de caracteres interno. UTF 16 utiliza 2 bytes por caracteres ou um par de palavras 2 bytes por caracter, mas apenas se necessário, uma vez que é uma variável largura que codifica .

"Para caracteres no multilingues básica plana (BMP) a codificação resultante é uma palavra de 16 bits única. Para caracteres nos outros planos, a codificação irá resultar em um par de palavras de 16 bits"

Meu palpite sobre booleans seria que eles são quatro bytes como o padrão de registro é de 32 bits e este seria o tamanho mínimo Net poderia fazer uma operação lógica em forma eficiente, a menos que usando operações bit a bit.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top