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 :

Clear, erase et allocation mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Par défaut Clear, erase et allocation mémoire
    Bonjour,

    j'aimerais connaitre le comportement de clear et erase sur un vector.
    En particulier, si je fais le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::vector<OBJ> v;
    v.reserve(1024);
    (on remplit...)
    v.clear();
    l'allocation mémoire faite par le "reserve" est-elle conservée ou non ?

    Qu'en est-il pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::vector<OBJ> v;
    v.reserve(1024);
    (on remplit...)
    v.erase(v.begin(), v.end());
    Expérimentalement, il me semble que le "erase" ne nécessite pas de "reserve" par la suite contrairement au "clear" mais j'aimerais une confirmation plus "théorique"

    Merci d'avance !

  2. #2
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    l'allocation mémoire faite par le "reserve" est-elle conservée ou non ?
    Oui.

    Expérimentalement, il me semble que le "erase" ne nécessite pas de "reserve" par la suite contrairement au "clear" mais j'aimerais une confirmation plus "théorique"
    reserve() ne sert qu'à des fins d'optimisation, il n'a aucune influence sur le reste des opérations (d'un point de vue externe à la classe).

    Quant à clear(), si tu regardes le code source tu verras qu'il fait exactement un appel à erase(begin(), end()).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Par défaut
    Tiens, c'est curieux car en remplaçant tous les "clear" par des "erase" dans mon code, je gagne pas mal de temps (il y a bcp de push back, c'est pourquoi je me posais la question).

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Ecco59
    Tiens, c'est curieux car en remplaçant tous les "clear" par des "erase" dans mon code, je gagne pas mal de temps (il y a bcp de push back, c'est pourquoi je me posais la question).
    Salut,

    Et c'est normal...

    Quand tu fais un push_back, ton vector va commencer par vérifier s'il n'est pas nécessaire de réallouer de la mémoire afin de pouvoir insérer le nouvel élément...

    Si le malheur fait qu'il faut réallouer de la mémoire, le vector va:
    • allouer de la mémoire supplémentaire (selon les implémentations, soit pour la taille actuelle + une taille fixe, soit pour une taille dépendant de la taille actuelle, souvent taille actuelle*2 (mais pas obligatoirement)) pour un "tableau temporaire"
    • copier l'ensemble des éléments présents dans le tableaux d'origine dans le tableau temporaire (selon les implémentations)
    • libérer la mémoire du tableau d'origine
    • faire en sorte que le tableau temporaire devienne le tableau d'origine


    Evidemment, plus le tableau devient important, plus le temps nécessaire à ces actions (et principalement celui nécessaire à la copie des éléments du tableaux) va devenir important...

    Si tu lui dit, dés le départ, de réserver la place pour 1024 éléments pour ton vector, ce ne sera qu'à la 1025 ieme insertion (sans suppression, on s'entend ) qu'il devra envisager d'allouer de la mémoire supplémentaire pour pouvoir effectuer l'insertion
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Par défaut
    Oui oui, ça je suis bien d'accord.
    Mais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::vector v;
    v.reverse()
    (plein de push_back...)
    v.clear()
    (plein de push_back...)
    j'obtiens un temps de traitement plus long qu'avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::vector v;
    v.reverse()
    (plein de push_back...)
    v.erase(v.begin(), v.end())
    (plein de push_back...)
    C'est pour ca que j'avais l'impression que le clear "désallouait" la mémoire contrairement au erase.

  6. #6
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il suffit d'aller voir dans ton implémentation ce qui change entre clear et erase. Chez moi c'est équivalent, mais chez toi peut-être que ça ne l'est pas.

Discussions similaires

  1. Pb d'allocation mémoire malloc
    Par oz80 dans le forum C++
    Réponses: 5
    Dernier message: 18/11/2005, 17h23
  2. Limite Allocation Mémoire d'un tableau d'entier
    Par l9ft b9hind dans le forum C++
    Réponses: 5
    Dernier message: 27/10/2005, 19h29
  3. Allocation mémoire
    Par DestyNov@ dans le forum C++
    Réponses: 9
    Dernier message: 23/08/2005, 08h09
  4. [Pointeur] Allocation mémoire
    Par Rayek dans le forum Langage
    Réponses: 22
    Dernier message: 20/05/2005, 10h26
  5. Allocation mémoire dynamique
    Par ITISAR dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/01/2005, 09h59

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