83 votes

Existe-t-il une méthode similaire à sizeof en Java?

Existe-t-il une méthode intégrée en Java pour trouver la taille d'un type de données? Y a-t-il un moyen de trouver la taille?

64voto

Stephen C Points 255558

Pas de. Il n'y a pas une telle méthode. Il n'est pas nécessaire en Java, comme la langue supprime la nécessité d'une application à savoir sur la façon de beaucoup plus d'espace doit être réservé pour une valeur primitive, un objet ou un tableau avec un nombre donné d'éléments.

Vous pourriez penser qu'un opérateur sizeof serait utile pour les personnes qui ont besoin de savoir de combien d'espace de leurs structures de données à prendre. Cependant, vous pouvez également obtenir ces informations et plus, simplement et de manière fiable à l'aide d'une mémoire Java profiler, donc il n'est pas nécessaire pour un sizeof méthode.


@Davor fait le point de sizeof(someInt) serait plus lisible qu' 4. Je ne suis pas sûr que je suis d'accord ... parce que je pense que chaque programmeur Java devrait savoir qu'un int est toujours 32 bits / 4 octets. (Et en plus, il est rarement nécessaire d'utiliser la taille d'un type de code Java ...)

Toutefois, si vous acceptez que la lisibilité de l'argument, alors le remède est dans vos mains. Il vous suffit de définir une classe comme ça ...

public class PrimitiveSizes {
    public static int sizeof(byte b) { return 1; } 
    public static int sizeof(short s) { return 2; }
    // etcetera
}

... et de manière statique l'importer ...

import static PrimitiveSizes.*;

Pourquoi n'en ai pas la Java des concepteurs de mise en œuvre de cette norme bibliothèques? Ma conjecture est qu'ils ne pense pas que cela en vaut la peine ... et je suis d'accord avec cela. Il y a aussi le problème que la prochaine demande serait pour un sizeof(Object o) méthode ... qui se heurte à des difficultés techniques.

15voto

Ramesh Points 141

À partir de l' article en JavaWorld

Un superficiel réponse est que Java ne fournit pas quelque chose comme C est sizeof(). Cependant, nous allons examiner pourquoi un programmeur Java peuvent de temps à autre le souhaitez.

Un programmeur C gère la plupart de discbased les allocations de mémoire lui-même, et sizeof() est indispensable pour connaître la mémoire des tailles de bloc de allouer. En outre, C allocateurs de mémoire comme malloc() ne presque rien d'aussi loin que l'initialisation de l'objet est concerné: un programmeur devez définir tous les champs d'objet sont des pointeurs vers d'autres objets. Mais quand tout est dit et codées en C/C++ de l'allocation de mémoire est tout à fait efficace.

Par comparaison, Java objet d'allocation et de la construction sont liés ensemble (il est impossible d'utiliser un alloués mais non initialisée instance de l'objet). Si une classe Java définit les champs qui sont des références d'autres objets, il est également fréquent pour les fixer à la construction temps. L'allocation d'un objet Java donc souvent alloue de nombreux interconnectés instances de l'objet: un objet graphique. Couplé avec collecte des ordures automatique, ce est trop pratique, et peut faire vous vous sentez comme vous n'avez jamais à vous soucier d'allocation mémoire Java des détails.

Bien sûr, cela ne fonctionne que pour de simples applications Java. En comparaison avec C/C++, l'équivalent Java structures de données ont tendance à occuper plus de physique de la mémoire. Dans le développement de logiciels d'entreprise, l'obtention de près à la maximum de mémoire virtuelle disponible aujourd'hui sur 32 bits Jvm est une commune de la l'évolutivité de la contrainte. Ainsi, un programmeur Java pourrait bénéficier de sizeof() ou quelque chose de semblable à garder un oeil sur si son structures de données sont trop grandes ou contenir des goulets d'étranglement de mémoire. Heureusement, la réflexion Java vous permet d'écrire un tel outil tout à fait facilement.

Avant de poursuivre, je vais renoncer à une partie fréquentes mais incorrecte les réponses à cet article de la question. Erreur: Sizeof() n'est pas nécessaire parce que les types de base de Java tailles sont fixes

Oui, un Java int de 32 bits dans toutes les machines virtuelles et sur toutes les plateformes, mais ce est seulement une langue exigence de la norme pour les programmeur perceptible largeur de ce type de données. Une telle int est essentiellement un type abstrait de données et peuvent être sauvegardés par, disons, un 64-bit de la mémoire physique du mot sur une machine 64 bits. Il en va de même pour types de nonprimitive ultérieures: la Java language specification ne dit rien au sujet comment les champs de la classe devrait être aligné dans la mémoire physique ou un tableau de booléens ne pouvait pas être mis en œuvre comme un compact bitvector à l'intérieur de la JVM. Erreur: Vous pouvez mesurer un objet de la taille par sérialisation en un flux d'octets et en regardant le flux résultant de la longueur

La raison pour laquelle cela ne fonctionne pas parce que la sérialisation mise en page est seulement à distance reflet du vrai dans-disposition de la mémoire. Un moyen facile de voir c'est en regardant comment les Chaînes obtenir sérialisé: dans la mémoire de tous les char est au moins 2 octets, mais en forme sérialisée des Chaînes UTF-8 codé et donc tout type de contenu prend la moitié de l'espace

11voto

sprocketonline Points 1512

La Java Native d'Accès la bibliothèque est généralement utilisé pour appeler natif bibliothèques partagées à partir de Java. Dans cette bibliothèque, il existe des méthodes pour déterminer la taille des objets Java:

L' getNativeSize(Class cls) de la méthode et des surcharges fournira la taille pour la plupart des classes.

Par ailleurs, si les classes héritent de la " JNA " de la Structure de classe de la calculateSize(boolean force) méthode sera disponible.

10voto

Murali Mohan Points 69

Vous pouvez faire des manipulations de bits comme ci-dessous pour obtenir la taille des primitives:

     public int sizeofInt() {
            int i = 1, j = 0;
            while (i != 0) {
                i =  (i<<1); j++;
            }
            return j;
        }

        public int sizeofChar() {
        char i = 1, j = 0;
        while (i != 0) {
            i =  (char) (i<<1); j++;
        }
        return j;
    }
 

5voto

objects Points 6137

non, il n'y en a pas

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