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 :

std::list, std::vector et allocation m�moire


Sujet :

SL & STL C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 std::list, std::vector et allocation m�moire
    Bonjour,

    Une question que je me pose sur l'allocation de m�moire dans les listes et les vecteurs :

    Est-il possible de stocker dans un pointeur l'adresse d'un objet ins�r� dans une liste ou dans un vecteur et d'�tre s�r que ce pointeur pointe toujours sur l'objet ?

    En gros, faire :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    std::list conteneur;  ou std::vector conteneur;
    cObject objet;
    cObject *pObjet = &objet;
     
    conteneur.push_back(objet);
    Pour les listes, il s'agit de listes chain�es, donc � priori, pas de soucis...

    Mais pour les vecteurs, que se passe-t-il en cas de r�allocation (pour cause de d�passement, par exemple) ?

    Est-ce qu'au moment de la r�allocation, l'objet lui-m�me est d�plac� ?
    Ou est-ce que seulement la zone r�serv�e pour les it�rateurs est r�allou�e et seulement les it�rateurs sont d�plac�s ?

    Merci !

  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
    Si tu prends l'adresse avant insertion, tu es coul� � tous les coups car c'est une copie qui est stock�e. Si tu la prends apr�s, elle est valide tant que tu ne fais pas d'op�ration invalidante sur ton conteneur :
    - Suppression et ajout de n'importe quel �l�ment dans un vector, un deque ou un string
    - Suppression de l'�l�ment en question dans tout autre conteneur (list, set, map)

  3. #3
    Membre �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par d�faut
    Pour les vecteurs il est certain que �a ne fonctionnera pas.
    Sinon, il y a un truc formidable pour ne pas avoir � se poser la question: boost::ptr_container. Ce sont des variantes point�es des containers de la stl.
    En dehors de �a, stocker des it�rateurs serait peut-�tre pr�f�rable, mais d'autres sur ce forum t'en diront plus sur le sujet (je ne suis pas certain de la fa�on dont �voluent les it�rateurs si leur conteneur est modifi�).

  4. #4
    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
    Laurent Gomila :

    car c'est une copie qui est stock�e
    Tu veux dire que l'ensemble de mon objet est recopi� pour l'insertion ?
    L'objet existe donc 2 fois en m�moire ?


    Suppression et ajout de n'importe quel �l�ment dans un vector, un deque ou un string
    Tu veux dire que si j'insere un autre �l�ment apres celui-ci, son adresse a chang�e ?

    Suppression de l'�l�ment en question dans tout autre conteneur
    Je suppose que c'est parceque le destructeur de l'�l�ment est appel� lors de sa suppression d'un autre conteneur... Mais si l'objet est recopi� lors de son insertion, pourquoi �a pose soucis ?

  5. #5
    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
    En dehors de �a, stocker des it�rateurs serait peut-�tre pr�f�rable
    Pointeur ou it�rateur c'est pareil. Par contre pour un vector on peut stocker des indices, �a peut aider dans certains cas.

  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
    Tu veux dire que l'ensemble de mon objet est recopi� pour l'insertion ?
    L'objet existe donc 2 fois en m�moire ?
    Oui. Enfin comme le premier est d�clar� sur la pile il sera d�truit pas longtemps apr�s.

    Tu veux dire que si j'insere un autre �l�ment apres celui-ci, son adresse a chang�e ?
    Potentiellement. S'il n'y a pas assez de place, il y aura r�allocation de m�moire et donc d�placement des �l�ments en m�moire.

    Je suppose que c'est parceque le destructeur de l'�l�ment est appel� lors de sa suppression d'un autre conteneur...
    Ben c'est surtout parce que l'�l�ment n'existe plus. Donc tout pointeur qui pointerait dessus deviendrait invalide.

    Mais si l'objet est recopi� lors de son insertion, pourquoi �a pose soucis ?
    Parce que c'est sur la copie que tu pointes. L'original ayant �t� d�truit depuis longtemps.

  7. #7
    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
    Ok, merci pour toutes ces precisions.

    Je vais un peu preciser le contexte :

    Je cr�e des objets, suite � des actions de l'utilisateur. Donc de facon dynamique.

    La liste de certains de ces objets doit �tre parcourue tr�s tr�s fr�quemment pour en lire le contenu.

    Le parcours de cette liste est � peu de chose pr�s, le coeur de mon programme. Je souhaite donc l'optimiser au maximum.

    Dans un premier temps, j'ai fait �a :

    - cr�ation de chaque objet avec un new()
    - insertion dans une std::list
    - parcourt de la liste

    Ensuite, �a :
    - cr�ation de chaque objet avec un new()
    - insertion dans un std::vector
    - parcourt du vecteur

    Ici, j'ai gagn� un d�r�fencement � chaque parcourt de la liste, au prix d'une r�allocation de temps en temps (pas tr�s grave)

    Maintenant, j'essaie de faire en sorte que chaque objet cr�� puis ins�r� soit dans la m�me zone m�moire que les autres, afin d'�viter de devoir recharger le cache m�moire � chaque fois que l'on passe � l'objet suivant.

    Je pensais trouver une astuce en les allouant sur la pile afin qu'ils soient proches les uns des autres... visiblement c'est rap� !

    Auriez-vous des suggestions ?

  8. #8
    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
    Salut,

    Si ton vecteur (ou ta liste ou ... d'une mani�re g�n�rale, ton conteneur) est pr�vu pour contenir des pointeurs, rien ne t'empeche d'�crire un code du genre de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    monvecteur.push_back(new MonObjet(...));
    mamap.insert(std::make_pair(key,new Monobjet(...));
    //etc
    Les ... dans les parentheses repr�sentant, bien �vididemment, les arguments � passer au constructeurs
    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

  9. #9
    Membre �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par d�faut
    Tu te pose bien beaucoup de questions, et certains de tes raisonnements sont bizarres. Pour choisir ton conteneur, voici ce que tu dois te dire:
    - si tu fais des ajouts/suppressions fr�quents en mileu de liste, prends une list
    - si tu fais des parcours al�atoires, prends un vector
    - les deux? normalement un deque doit te fournir un compromis
    Pense aussi � jouer avec la capacit� des vector et des deque.
    Et �a ne sert � rien d'instancier par pointeur si c'est pour copier ton objet dans un conteneur juste apr�s, de m�me que c'est un peu l'inverse que de vouloir optimiser le cache m�moire (puisque tes objets peuvent �tre instanci�s n'importe o� dans la m�moire). Soit dit en passant, pense plutot � minimiser la complexit� de tes algos plutot que d'optimiser le cache m�moire, en g�n�ral �a paie plus

Discussions similaires

  1. std::list ou std::vector comme argument de template
    Par epsilon68 dans le forum C++
    R�ponses: 11
    Dernier message: 01/03/2011, 23h34
  2. std::vector et espace m�moire
    Par salseropom dans le forum C++
    R�ponses: 6
    Dernier message: 10/02/2011, 23h25
  3. [Tuto] Recherche de tutoriel sur std::list et std::vector
    Par pegase06 dans le forum SL & STL
    R�ponses: 27
    Dernier message: 24/07/2007, 16h23
  4. R�ponses: 16
    Dernier message: 30/05/2006, 18h46
  5. acceder au n i�me element d'une liste std::list
    Par sorari dans le forum SL & STL
    R�ponses: 4
    Dernier message: 23/03/2005, 15h21

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