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

SL & STL C++ Discussion :

Occupation mémoire d'une map


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut Occupation mémoire d'une map
    Bonsoir à toutes et à tous,

    Je travaille sur une application dont la maîtrise de l'occupation mémoire est la une priorité.

    J'ai besoin de gérer mes données et un conteneur de type map pourrait bien m'aider mais j'ai quelques soucis.

    J'aimerai savoir s'il est possible d'initialiser le contenu de ma map avec un certain nombre d'instance par défaut. J'ai fait le test en itérant autant de fois que nécessaire et ça marche mais j'aimerai savoir s'il n'existe pas un autre moyen (à priori je dirai non vu l'interface de la map mais bon, on ne sait jamais).

    J'aimerai aussi savoir comment faire pour estimer l'occupation mémoire d'une map initialisée avec un certain nombre d'instances, disons N instance. Cette question peut paraître idiote mais j'ai fait un sizeof de ma map initialisée et la valeur de retour est la même que pour ma map vide ... je trouve ça bizarre.

    J'ai aussi remarqué qu'il existe une méthode max_size() mais cette dernière me renvoie une valeur gigantesque ... là aussi je trouve ça bizarre. En plus de ça, je n'ai pas trouvé où fixé cette valeur maximum, ce n'est pas possible ?

    D'avance merci pour vos réponses.

    Bonnes soirée à toutes et à tous.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    C'est normal que sizeof donne une "mauvaise" information, il retourne juste la mémoire prise en direct par la map, pas la mémoire allouée par celle ci.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A
    {
      A::A() : ptr(new char[9999999]) {}
      char* ptr;
    };
    sizeof(A) sera tout petit, contrairement à son "empreinte mémoire". Rien ne permet de mesurer cette dernière simplement en C++.

    Pour avoir une idée de la place prise par un conteneur, ce qu'il faut savoir c'est combien ce dernier prend en plus que l'espace strictement nécessaire pour stocker les données qu'ils contient. Par exemple, un vecteur a un overhead très faible, de l'ordre de la taille de 2 ou 3 pointeurs pour l'ensemble du vecteur. Pour une map, cet overhead est plutôt de 2 pointeurs par éléments à l'intérieur de la map. De plus, la mémoire est fragmentée, alors que dans un vecteur elle est monobloc.

    Pourquoi je compare avec vecteur ? Parce que dans certains cas d'utilisation (en gros si les données changent très rarement), il est possible d'utiliser un vecteur trié à la place de la map, ce qui peut être intéressant en termes d'utilisation mémoire.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut
    Merci pour ta réponse.

    Je trouvais bizarre aussi que la map ne change pas de taille

    Je pense que ça va me poser un problème, si je ne peux pas maîtriser l'occupation de la mémoire en utilisant ce conteneur, je vais devoir me tourner vers une autre solution ... dommage.

    Au fait, où trouves tu les informations sur l'architecture interne des conteneurs ? Si je peux regarder à l'occasion, ça me sera formateur.

    D'avance merci.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Je ne pense pas que l'architecture interne des conteneurs soit formalisée, seul l'interface utilisateur l'est. Tu peux donc regarder l'implémentation fournie avec ton compilo, tout est dans des .h.

    Sinon, comme je le disais dans ton autre discussion, regarde le 4ème paramètre template de map, c'est l'allocator. Tu peux en dériver un du standard en y ajoutant simplement des infos qui te permettront de faire des stats, du debug, etc, afin d'évaluer rapidement la consommation.

    Sur codeguru il y a quelques articles intéressants sur les allocator (je n'en ai d'ailleurs pas trouvé ailleurs): exemple.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par camboui Voir le message
    Je ne pense pas que l'architecture interne des conteneurs soit formalisée, seul l'interface utilisateur l'est.
    Sauf que cette formalisation de l'interface et des contraintes de performance associée ne laisse pas franchement le choix en terme de structure d'implémentation (mais elle laisse le choix sur les détails, permettant des implémentations de meilleure qualité que d'autres).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut
    Merci pour vos réponses.

    J'ai regardé les Allocator ... mais je ne pense pas que j'aurai besoin de m'y plonger d'avantage.

    La seule chose que je voulais savoir c'est où se fait l'allocation (tas ou pile), vos réponses m'aident à y voir plus clair.

    J'ai fait un petit test avec une classe sous sa forme canonique pour voir quand se font les allocations en cas d'ajout, suppression, swap d'éléments ...

    Merci à toutes et à tous.

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

Discussions similaires

  1. Problème occupation mémoire d'une matrice dans un bus creator
    Par maoussecostaud dans le forum Simulink
    Réponses: 1
    Dernier message: 22/06/2009, 12h13
  2. Réponses: 11
    Dernier message: 13/01/2006, 15h30
  3. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39
  4. Technique pour faire une map en relief
    Par rvzip64 dans le forum OpenGL
    Réponses: 4
    Dernier message: 28/06/2004, 22h44
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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