J'utilise un Y a-t-il un moyen de le réduire? Je sais que dans un vecteur, vous devez utiliser le "truc de swap", que je suppose fonctionnerait ici aussi, mais je préfère éviter que 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 connais pas intimement la mise en œuvre de la drique, mais je me comprends qu'il serait possible de réaliser une telle chose sans beaucoup de copies (alors qu'avec un vecteur, il n'est clairement pas). P>
J'utilise le VC ++ (Dinkumware) STL, si cela fait toute différence. P> std :: deque code> pour stocker un nombre assez grand d'objets. Si je retire un tas de ces objets, il me semble que son utilisation de la mémoire ne diminue pas, de la même manière à STD :: Vector. P>
4 Réponses :
Il n'y a aucun moyen de le faire directement dans un std :: deque. Cependant, il est facile de faire en utilisant un temporaire (ce qui se passe fondamentalement dans un vecteur STD ::: Lorsque vous vous contractiez la capacité). P>
Voici un Bon article sur STD :: DEQUE , en comparant à STD: :vecteur. Le fond même montre un moyen propre pour échanger et rétrécir un vecteur qui fonctionne la même chose avec deque. P>
Merci. J'aurais soupçonné qu'il n'aurait peut-être pas un moyen de le faire, mais cela semble être possible que cela devrait être possible ... j'ai expliqué dans la question pourquoi je suis répugnant à utiliser la chose de swap dans ce cas, mais peut-être que je vais avoir à y examiner sans distinction.
Peter - la meilleure option avec la chose "Swap" est d'utiliser des éléments alloués en tas. Dans ce cas, vous ne faites qu'une copie des références, au lieu d'une copie de tous les éléments et de leur mémoire. C'est assez mineur, typiquement.
La chose de swap ne sonne jamais les pointeurs internes du vecteur, pas les éléments eux-mêmes.
La taille de la mémoire d'une drique pourrait ou pourrait ne pas diminuer. quand em> et comment cela se produit est spécifique à la mise en œuvre. Malheureusement, vous n'avez pas beaucoup de contrôle manuel sur ceci depuis que DESQUES manque même de capacité () ou de réserve (). P>
Je suggérerais Swap () si vous détectez effectivement la libération de la mémoire n'est pas effectuée à votre convenance. P>
Une connaissance intime de la gestion de la mémoire deque peut probablement être gagnée du site Web de dikum (c'est votre mise en œuvre actuelle, non?) P>
std :: Deque retournera la mémoire à son allocator. Souvent, cet allocator ne retournera pas la mémoire au système d'exploitation. Dans de tels cas, il apparaît comme si la mémoire n'est pas "publiée". Les détecteurs de bons de fuite de mémoire seront satisfaits dès que la mémoire est renvoyée à l'allocateur et comprendra que toutes les mémoires ne sont pas publiées par gratuit () code>. P>.
comme des informations ajoutées à ceci: p>
en C ++ 0x / c ++ 11, deque (et plusieurs autres conteneurs) a une nouvelle fonction appelée "shrink_to_fit" qui éliminera les éléments excédentaires et aligner essentiellement la capacité de la capacité () == () P>
la capacité () peut toujours être plus élevée que la taille () après Stroll_to_fit () - il s'agit d'une demande non contraignante; Void Shrink_To_fit () {} code> est une implémentation parfaitement légale, en fait. Mais même avec une bonne implémentation, la capacité () peut être supérieure à la taille (), par exemple si le conteneur a trop peu d'éléments, cela pourrait toujours valoir la peine d'allouer plus de mémoire. (Pensez à des conteneurs vides.)
Avez-vous établi que votre implémentation de la DEQUE ne libère pas déjà des blocs de mémoire dès que suffisamment d'éléments sont 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 que, d'une manière assez rugueuse et prête: j'ajoute 100 000 articles -> L'utilisation de la mémoire est ~ 90 Mo. J'ajoute plus 100 000 -> L'utilisation de la mémoire est de ~ 170 Mo. Je supprime 100 000 articles -> L'utilisation de la mémoire est toujours ~ 170 Mo. Ajoutez encore 100 000 -> toujours 170. Je suppose que 100 000 articles est plus que suffisant qu'il aurait des blocs vides qu'il aurait libéré s'il allait.
Utilisation de la mémoire du processus, ou utilisation de la mémoire de la collection? Juste parce que la collection libère la mémoire ne signifie pas que cela remonte au système d'exploitation, essayez donc d'allouer 80 Mo de matrice de charcuterie après avoir retiré les éléments et voyez si une utilisation va à 250 Mo ou reste à 170. Toutes mes excuses si vous connaissez déjà tout cela Des choses et ont comptabilisé pour cela - des millions ne le feraient pas.
Notez également que je ne sais vraiment pas à quoi m'attendre - je n'ai aucune idée de la façon dont Dinkum en particulier ou des bibliothèques en général gère la mémoire deque. Dès que quelqu'un vient qui fait qui fait, vous pouvez vous ignorer en toute sécurité :-)
Toutes les bonnes questions - mes numéros étaient la consommation de processus, mais il semble que j'avais néanmoins correct. Les 80 Mo de charrette de caractère poussent la mémoire jusqu'à 250 Mo.
Je viens de remarquer qu'un seul tableau de charcuterie de 80 Mo est trop simpliste, car même si la dent est libérée de la mémoire, elle aurait peut-être laissé un espace libre fragmenté. Donc, mon test proposé ne prouve toujours pas que la dent est suspendue à la mémoire, désolé. Était assez tard la nuit. Vous devez faire un grand nombre d'allocations assez petites pour prouver qu'il n'y a aucun moyen que votre application puisse utiliser le mou. Peut-être utiliser une deuxième dentelle plutôt que des tableaux simples, pour obtenir un motif d'allocation comparable. Ou vérifier la quantité de mise en œuvre de Dinkum visible dans les en-têtes.