Pourquoi Java booléennes primitif de taille non définie?
La La Machine Virtuelle Java De Spécification 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.
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 un octet, ou courts, type de ne pas utiliser le proxy pour un booléen au lieu de int?
- Pour tout 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?
Vous devez vous connecter pour publier un commentaire.
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 de cellules sont équipées, les 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
etbastore
opcodes, ce qui implique que les tableaux de booléens prendre 1 octet par élément.Autant que dans la mémoire de l'objet de mise en page, il est couvert en vertu de la "mise en œuvre privée" les 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.
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?:
La 5ème Édition de Java en un Mot (O'Reilly) dit un booléen de type primitif est de 1 octet. Que peut-être tort, sur la base de l'examen du segment de mémoire est affiché. Je me demande si la plupart des machines virtuelles ont des problèmes avec l'allocation de moins d'un octet pour les variables.
Le booléen de cartographie a été réalisé avec un 32 bits PROCESSEUR à l'esprit. La valeur int a 32 bits donc il peut être traité en une seule opération.
Voici une solution de Peter Norvig Java de la QAI:
Rarement Répondu Aux Questions pour mesurer la taille (avec une certaine imprécision):
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é coûts/temps.
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.
Boolean représente un bit d'information, mais sa "taille" n'est pas quelque chose qui est précisément défini, disons Sun Java tutoriels. Littéraux booléens n'ont que deux valeurs possibles ceux qui sont le vrai et le faux. Voir Types De Données Java pour plus de détails.
Pourquoi ne pas en faire un .java fichier comme ceci:
Empty.java
et une classe comme ceci:
NotEmpty.java
Compiler les deux et de comparer les .les fichiers de classe avec un éditeur hexadécimal.