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

C++ Discussion :

Sizeof d'une architecture d'objets


Sujet :

C++

  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut Sizeof d'une architecture d'objets
    Bonjour,

    Je programme avec Visual Studio 2005, et j'ai créé un petit projet qui commence à prendre de l'envergure.

    Parmi les objets que le programme manipule, certains sont imbriqués : un conteneur qui contient des boites, qui contiennent des objets...

    J'aimerais determiner la place occupée en mémoire par le conteneur (par exemple).

    C'est à dire la place qu'il occupe lui + ses boites + les objets de ses boites....

    Vu que c'est à des fins de tests, j'aimerais eviter d'implementer de nouvelles méthodes, j'aimerais juste savoir si c'est possible de connaitre l'espace occupé grâce à un debuggeur ou quelque autre manip'

    Merci.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Pas à ma connaissance, à moins de passer par des opérateurs d'allocation spéciaux, et monopoliser un des "types de bloc" (il me semble qu'il n'y en a pas plus de seize disponibles) pour ça...

    En C++, tu auras plus vite fait de faire ta propre fonction de comptage de taille...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Oui, probablement...

    Je comptais sur une fonctionnalité méconnue du debuggeur ou un truc de ce genre...

    Tant pis !

  4. #4
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    pour une estimation tu peux utiliser les task manager. Tu fais une version du prog sans instancier la taille que tu veux mesurér et un autre avec.
    Puis la differwences des deux resultats te donneras une approximation.

    Sinon tu sera obliger de faire de nouvelles methodes. / de coder

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ZaaN
    pour une estimation tu peux utiliser les task manager. Tu fais une version du prog sans instancier la taille que tu veux mesurér et un autre avec.
    Puis la differwences des deux resultats te donneras une approximation.

    Sinon tu sera obliger de faire de nouvelles methodes.
    tres large comme estimation, car le task manager ne donne pas la mémoire allouée a un instant donnée mais une partie de la mémoire réservée...

    le plus judicieux pour estimer la taille de son conteneur est de faire qqchose comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      sizeof(conteneur) // taille du conteneur vide
    + sizeof(boites) * conteneur.size()  // n fois la taille d'une boite
    + sizeof(objet) * conteneur.size()   // n fois la taille d'un objet dans la boite
    bien sur, ceci est tres vague. je suppose ici qu'une boite ne comprend qu'un seul objet a la fois, qu'un conteneur référence ses boites par pointeurs, et encore (sans parler que je ne factorise pas mon code)... il faudrait connaitre l'existant plus précisemment pour faire un algo qui tienne la route. mais ca donne une idée...

  6. #6
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    toxcct :

    C'est evidemment la meilleure solution.

    Et c'est celle que j'ai implementée. Vu que c'était juste pour faire quelque tests, je voulais eviter d'ajouter du code un peu partout dans mon programme.

    Mais maintenant, c'est fait.

  7. #7
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    Citation Envoyé par toxcct
    tres large comme estimation, car le task manager ne donne pas la mémoire allouée a un instant donnée mais une partie de la mémoire réservée...
    Pourtant j ai des resultats, certe pas exact dans l'absolu, mais si mon programme instancier durant don execution les differences relatives sont tres precises...

    Alors experience faites, ca donne un bonne estimation

  8. #8
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Oui, sauf que mon logiciel est u plugin sous forme de DLL chargé dans un logiciel hôte.

    Ca devient difficile de faire la difference entre la memoire prise par l'hote, la memoire prise par le plugin et la memoire allouée par l'hote au chargement du plugin pour lui fournir des buffers de travail...

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Hum...
    Je pense avoir trouvé un moyen en surchargeant l'opérateur new, et en utilisant plusieurs tas.
    S'inspirer un peu de cet exemple : How to overload new to reduce memory fragmentation

    Voir ces fonctions:
    HeapCreate()
    HeapSize()
    HeapWalk()
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Effectivement, pour mettre en place une solution générique ça me parait la meilleure solution.

    Au passage, fort interressant cet article, dans mon code il arrive que je crée un grand nombre d'objets de petite taille...

    Surcharger "new" et "delete" peut etre une bonne piste pour reduire la consommation de mémoire tout en s'assurant que les objets sont alloués dans des zones mémoires très proches pour eviter les ruptures de cache lorsque je les traite tous "à la suite".

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si le sujet t'intéresse (gérer efficacement les allocations d'objets de petite taille), il y a également une solution portable décrite dans le livre Modern C++ design, et implémentée dans la bibliothèque Loki.

  12. #12
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    ah !

    C'est bon à savoir, ça !

    Merci.

Discussions similaires

  1. Créer une architecture objet pour une appli
    Par thor76160 dans le forum NodeJS
    Réponses: 2
    Dernier message: 02/05/2013, 23h25
  2. Réponses: 12
    Dernier message: 03/07/2009, 13h37
  3. [VB6] Sauvegarder une collection d'objets
    Par Sayagh dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2003, 11h58
  4. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 12h11
  5. [VB6]Passage par référence d'une prop. d'objet à une fct
    Par -gYs- dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 02/09/2002, 08h55

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