IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Sizeof et générique spécialisée


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Par défaut Sizeof et générique spécialisée
    Bonjour

    Comme il n'y a pas d'opérateur sizeof en Java je cherche un moyen de substitution. J'aimerai donc coder une classe du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Sizeof
    {
         public static int Get(Class<?> type)
         {
              return GetInternal( type );
         }
     
         private static int GetInternal(Class<float> type)
         {
              return 4;
         }
    }
    Je pourrais l'utiliser comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int floatSize = Sizeof.Get( float.class );
    Mais je ne sais pas trop quoi mettre dans la signature de ma fonction GetInternal pour que ça fonctionne. J'ai été voir du côté des générique mais je n'ai rien trouvé. Une petite idée ?

    Kromagg

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    qu'est-ce que tu veux obtenir avec Sizeof ?
    la dimension de la classe sur un écran ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Nouveau membre du Club
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Par défaut
    Salut,
    une solution que j'ai vu à plusieurs reprise consiste à ajouter une méthode "getSize()" à tous les objets qu'on peut vouloir "peser". Pourquoi pas via une interface "Sizeable"?

    Ensuite tu peux utiliser les constantes de java pour calculer la taille de tes divers objests ( Boolean.SIZE, Integer.SIZE, ...). Bien évidemment, il faut faire attention aux collections, mais généralement : un "Collection.size() * Type.getSize()", suffit

    En espérant t'avoir éclairé.

    EDIT : méthode valable en utilisant la sérialization java, pour ce qui est de la taille en mémoire, c'est autre chose.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Marchera pas:

    1) le choix de la méthode appelée se fait par le compilateur. Il n'a aucun moyen donc de savoir si un appel à getInternal(type) doit se faire sur getInternal(Class<Float>) ou getInternal(Class<TrucMuch>)

    2) même si c'était possible, Class<Float> et Class<TrucMuch>, c'est la même signature de méthode => interdit (ils ont la même "erasure")

    Dans ton cas, il faudrait faire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Sizeof
    {
         int FLOAT_SIZE = 4;
         public static int Get(Class<?> type)
         {
              if (type==Float.class)
                  return FLOAT_SIZE;
              else ....
         }
    Moche et long, éventuellement améliorable avec une Map<Class<?>,Integer>

    Mais il reste un point crucial:

    c'est quoi pour toi la taille d'une donnée?

    un float, c'est 4 octets de précision, mais pas nécessairement de stockage. Sauf si il n'est stocké que dans les registre, alors c'est 0
    un Float c'est déja plus compliqué: c'est le float + toute la structure autour de taille... ?
    un Integer, c'est encre plus compliqué: y a les meme cas que le Float, sauf pour les valeur -127,128, pourlequelle c'est 0
    Oui mais la référence vers un objet, ça occupe aussi de la place, 32 bits ou 64 suivant l'architercture... Sauf si l'objet est alloué sur la stack... Sauf si la jvm gère la compression des pointeurs ....

    bon amusement

    Citation Envoyé par Kromagg Voir le message
    Bonjour

    Comme il n'y a pas d'opérateur sizeof en Java je cherche un moyen de substitution. J'aimerai donc coder une classe du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Sizeof
    {
         public static int Get(Class<?> type)
         {
              return GetInternal( type );
         }
     
         private static int GetInternal(Class<float> type)
         {
              return 4;
         }
    }
    Je pourrais l'utiliser comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int floatSize = Sizeof.Get( float.class );
    Mais je ne sais pas trop quoi mettre dans la signature de ma fonction GetInternal pour que ça fonctionne. J'ai été voir du côté des générique mais je n'ai rien trouvé. Une petite idée ?

    Kromagg

  5. #5
    Membre éclairé Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Par défaut
    En fait c'est pour du développement sous Android avec OpenGL ES. J'ai une classe me permettant de gérer les VBO et j'ai besoin de 3 infos quand je créer un VBO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public class VertexBuffer
    {
         private int mGLHandle;
     
         private int mNumVertices;
         private int mVertexSize;
         private int mSizeInBytes;
         private Usage mUsage;
     
         public VertexBuffer(int numVertices, in vertexSize, Usage usage)
         {
              mNumVertices = numVertices;
              mVertexSize = vertexSize;
              mSizeInBytes = numVertices * vertexSize;
              mUsage = usage;
     
              GLES20.glGenBuffers( 1, mGLHandle );
              GLES20.glBindBuffer( GLES20.GL_ARRAY_BUFFER, mGLHandle );
              GLES20.glBufferData( GLES20.GL_ARRAY_BUFFER, mSizeInBytes, null, MappingGLES.GetUsage( usage ) );
         }
    }
    Typiquement dans mon VBO je stocke des float et j'ai besoins de connaitres le nombre de float que je veux y mettre ainsi que la taille d'un float en mémoire afin de connaître la taille que je dois réserver en VRAM.
    Après je peux remplacer float par Vector3 qui correspond à 3 float et faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sizeof.Get( Vector3 );
    Au passage pourquoi l'opérateur sizeof n'existe pas en Java ?

    Kromagg

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Les objets java ne sortent pas de la JVM. En conséquence, l'espace dont tu a besoin en VRAM n'a rien à voir avec les objets java, mais avec ce que tu va mettre dans cette vram, donc, la taille occupé par un float opengl qui n'est pas nécessairement celle d'un float java.


    Quand à l'absence de sizeof en java, c'est pour trois raisons
    1) impossible de savoir la taille d'un objet sans l'instancier (trop de paramètres dépendant de la jvm)
    2) on n'a pas besoin de connaitre la taille exacte d'une donnée en java pour l'utiliser
    3) si tu veux estimer ta consommation mémoire, un profiler est plus à même de te donner une réponse correcte.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Kromagg Voir le message
    Après je peux remplacer float par Vector3 qui correspond à 3 float
    Tu peux pas. Tu peux, bien sûr, faire une classe qui contient 3 float. Mais cela ne te dira rien sur la manière dont ils sont organisés en mémoire. Si tu as besoin d'emplacements précis en mémoire, c'est byte[] ou ByteBuffer (ou éventuellement FloatBuffer ou ce genre de choses, si tout est un Float dans ta mémoire.)

    Citation Envoyé par Kromagg Voir le message
    Au passage pourquoi l'opérateur sizeof n'existe pas en Java ?
    Parce que quand on veut stocker dans les octets, par exemple un entier de 32 bits ou un flottant de 32 bits, on sait déjà que leur taille en octets, ce sera 4. Donc on dit pas sizeof(quelqueChose), on dit 4.

    Dans les autres cas, comme l'a expliqué tchize_, la notion de "taille d'une donnée" est assez floue et ne veut donc pas dire grand-chose.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Template - méthodes génériques et spécialisées
    Par SAKDOSS dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 07/02/2011, 14h28
  2. Réponses: 2
    Dernier message: 07/12/2009, 16h50
  3. Distribution spécialisée apache ?
    Par FRANCKYIV dans le forum Développement
    Réponses: 5
    Dernier message: 23/10/2003, 15h46
  4. Erreurs (sizeof)
    Par deepfear dans le forum C
    Réponses: 13
    Dernier message: 25/09/2003, 13h56
  5. caractère générique utilisable dans strcmp
    Par barthelv dans le forum C
    Réponses: 9
    Dernier message: 01/08/2003, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo