J'utilise un std::deque
pour stocker un assez grand nombre d'objets. Si je supprime un tas de ces objets, il me semble que son utilisation de la mémoire ne diminue pas, de la même manière que std :: vector.Comment libérer de la mémoire à partir de std :: deque?
Y a-t-il un moyen de le réduire? Je sais que dans un vecteur, vous devez utiliser le «swap trick», ce que je suppose fonctionnerait ici aussi, mais je préfère éviter cela car cela nécessiterait de copier tous les éléments laissés dans le conteneur (et nécessite donc que vous ayez assez de mémoire pour stocker chaque objet deux fois). Je ne suis pas intimement familier avec la mise en œuvre de deque, mais ma compréhension de cela est qu'il pourrait être possible de réaliser une telle chose sans beaucoup de copies (alors qu'avec un vecteur ce n'est clairement pas le cas). J'utilise le STL VC++ (Dinkumware), si cela fait une différence.
Avez-vous établi que votre implémentation deque ne libère pas déjà des blocs de mémoire dès que suffisamment d'éléments ont été supprimés pour les vider? Ou est-ce que vous voulez vraiment presser les derniers octets en réaffectant le bloc à chaque extrémité? –
Je pense ainsi, d'une manière assez rude et prêt: J'ajoute 100.000 articles -> L'utilisation de la mémoire est ~ 90MB. J'ajoute un autre 100.000 -> l'utilisation de la mémoire est ~ 170MB. Je retire 100.000 articles -> l'utilisation de la mémoire est encore ~ 170MB. Ajouter encore 100.000 -> encore 170. Je suppose que 100.000 articles est plus que suffisant qu'il aurait des blocs vides qu'il aurait libérés s'il allait. – Peter
Utilisation de mémoire du processus ou utilisation de la mémoire de la collection? Tout simplement parce que la collection libère la mémoire ne signifie pas qu'elle retourne au système d'exploitation, alors essayez d'allouer 80 Mo de tableau char après avoir supprimé les éléments, et voyez si l'utilisation va à 250 Mo ou reste à 170. Excuses si vous connaissez déjà tout cela choses et ont pris en compte pour cela - des millions ne le feraient pas. –