Pourquoi ne pas redimensionner et des œuvres claires dans GotW 54?
Question
Se référant à l'article GotW 54 par Herb Sutter, il explique à propos de
-
La bonne façon de "Shrink-To-Fit" une vecteur ou deque et
-
La bonne façon de supprimer complètement un vecteur ou deque
Peut-on utiliser juste
container.resize()
etcontainer.clear()
pour la tâche ci-dessus ou suis-je manque quelque chose?
La solution
Il y a deux choses différentes qu'un vecteur détient: size
Vs capacity
. Si vous venez resize
le vecteur, il n'y a aucune garantie que la capacité (la quantité de mémoire réservée) doit changer. resize
est une opération trait à la quantité que vous utilisez, pas combien la capacité vectorielle est.
Ainsi, par exemple.
size == how much you are using
capacity == how much memory is reserved
vector<int> v(10);
v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear() // size == 0 but capacity (may or may) not be changed
En fin de compte, la capacité ne devrait pas changé sur toutes les opérations, car cela apporterait beaucoup d'allocation mémoire / frais généraux de désaffectation. Il dit que si vous avez besoin " deallocate " la mémoire réservé par le vecteur, le faire.
Autres conseils
Ni redimensionner () ni travail clair (). Le .capacity()
d'un vecteur est garanti d'être au moins aussi grand que le size()
actuel du vecteur, et garanti au moins aussi grande que la capacité reserve()
d. En outre, ce .capacity()
ne rétrécit pas, il est donc aussi au moins aussi grand que tout size()
précédent ou reserve()
ation.
Maintenant, le .capacity()
d'un vecteur est simplement la mémoire qu'il a réservé. Souvent, pas tous que la mémoire cotains objets. Redimensionnement supprime les objets, mais ne recycle pas la mémoire. Un vecteur ne peut recycler son tampon de mémoire lors de l'allocation d'un tampon plus large.
L'astuce swap fonctionne en copiant tous les ojets à un plus petit, mémoire tampon plus appropriée. Ensuite, le tampon de mémoire d'origine peut être recyclé. Cela semble violer la déclaration précédente que la mémoire tampon de mémoire d'un vecteur ne peut que croître. Cependant, avec le truc d'échange, vous avez temporairement 2 vecteurs.
Le vecteur a la taille et la capacité. Il peut contenir des éléments X, mais ont de mémoire non initialisée en magasin pour les éléments Y plus. Dans un effacement de la mise en œuvre typique, redimensionner (lors du redimensionnement de la taille plus petite) et claire ne compromettent pas la capacité. Le vecteur conserve la mémoire autour de lui-même, si vous voulez ajouter de nouveaux éléments à à un moment plus tard