114 votes

Taille du Java - booléen, type primitif-

La Machine Virtuelle Java Specification dit qu'il y a un support limité pour les booléens primitive types.

Il n'existe pas de machine virtuelle Java instructions uniquement dédiée aux opérations sur des valeurs booléennes. Au lieu de cela, les expressions dans le langage de programmation Java qui opèrent sur des valeurs booléennes sont compilés pour utiliser les valeurs de la machine virtuelle Java de type de données int.

Le ci-dessus, implique (même si j'ai peut-être mal interprété) que le type de données int est utilisé lors de l'utilisation sur les booléens, mais c'est un 32 bits, la mémoire de construire. Étant donné qu'un booléen ne représente que 1 bit d'information:

  • Pourquoi est-ce qu'un octet, ou courts, type de ne pas utiliser le proxy pour un booléen au lieu de int?
  • Pour toute JVM quel est le moyen le plus fiable de savoir exactement quelle quantité de mémoire est utilisée pour stocker un type booléen?

120voto

kdgregory Points 21849

Réponse courte: oui, les valeurs booléennes sont manipulés comme 32-bit entités, mais les tableaux de booléens utilisation 1 octet par élément.

Plus réponse: la JVM utilise 32 bits pile cellulaire, utilisé pour contenir des variables locales, des arguments de méthode, et les valeurs d'expression. Les Primitives qui sont plus petits que 1 cellule sont rembourrées, des primitives de plus de 32 bits (long et double) prendre 2 cellules. Cette technique réduit le nombre d'opcodes, mais ne avoir des propres effets secondaires (tels que la nécessité de masque octets).

Primitives stockées dans des tableaux peut utiliser moins de 32 bits, et il y a différents opérateurs pour charger et stocker des valeurs primitives à partir d'un tableau. Boolean et valeurs d'octets à la fois utiliser le baload et bastore opcodes, ce qui implique que les tableaux de booléens prendre 1 octet par élément.

Aussi loin que la mémoire de l'objet de mise en page, il est couvert en vertu de la "mise en œuvre privée" des règles, il peut être de 1 bit 1 octet, ou comme une autre affiche a noté, en l'alignant sur un 64 bits en double limite de mot. Très probablement, il prend le texte de base de la taille du matériel sous-jacent (32 ou 64 bits).


Aussi loin que de réduire au minimum la quantité d'espace que les booléens utilisation: il n'est vraiment pas un problème pour la plupart des applications. Pile d'images (en maintenant les variables locales et les arguments de méthode) ne sont pas très grandes, et dans le grand plan discret boolean dans un objet qui n'est pas grande non plus. Si vous avez beaucoup d'objets avec beaucoup de booléens, alors vous pouvez utiliser un peu de champs qui sont gérés par l'intermédiaire de votre getters et setters. Cependant, vous devrez payer une pénalité en temps de calcul qui est sans doute plus important que la pénalité dans la mémoire.

7voto

akuhn Points 12241

Un booléen quelque part dans la hiérarchie d'héritage pouvez utiliser jusqu'à 8 octets! C'est en raison de rembourrage. Plus de détails peuvent être trouvés dans la quantité de mémoire utilisée par mon objet Java?:

Je reviens à la question de comment beaucoup booléenne consomme, oui, c'est fait consommer au moins un octet, mais en raison de l'alignement des règles il peut consommer beaucoup de plus. À mon humble avis il est plus intéressant de savoir qu'un boolean[] consommera un octets par entrée, et pas un peu,plus certains frais généraux en raison de l'harmonisation et de le champ taille de la matrice. Il y a algorithmes de graphes où les grands champs de les bits sont utiles, et vous devez être conscient que, si vous utilisez une valeur de type boolean[] vous ont besoin de près de 8 fois plus de mémoire que vraiment nécessaire (1 octet contre 1 bit).

5voto

Matthew Flynn Points 1593

La 5e édition de Java in a Nutshell (o ' Reilly) indique un type de primitive booléen est 1 bit. Cela pourrait être mal, basé sur ce que montre l’examen du segment de mémoire. Je me demande si la plupart de machines virtuelles Java ont des problèmes avec allocation de moins d’un octet pour les variables.

3voto

Thomas Jung Points 17692

Le mappage booléen a été fait avec un processeur de 32 bits à l’esprit. La valeur int a 32 bits, donc il peut être traité en une seule opération.

Voici une solution de Java QAI de Peter Norvig : répondu que rarement des Questions pour mesurer la taille (avec certaines imprécision) :

2voto

Hardcoded Points 2786

Les processeurs fonctionnent sur un type de données longueur. Dans le cas des Processeurs 32 bits, ils sont 32 bits et donc ce que vous appelez " int " en Java. Tout en dessous ou au-dessus qui doivent être remplis ou découpé à cette longueur à l'avant de l'UC peut la traiter. Cela ne prendra pas beaucoup de temps, mais si vous avez besoin de 2 cycles de PROCESSEUR au lieu de 1 pour les opérations de base, cela signifie que doublé temps et coûts.

Cette spécification est dédié pour les Processeurs 32 bits, de sorte qu'ils peuvent traiter des booléens avec leur type de données natif.

Vous pouvez seulement avoir un ici: de la vitesse ou de la mémoire - SOLEIL a décidé de vitesse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X