Warum nicht die Größe und klare Werke in GOTW 54?
Frage
Unter Bezugnahme auf Artikel GOTW 54 von Herb Sutter, erklärt er über
-
Der richtige Weg, um "Shrink-to-Fit" ein Vektor oder deque und
-
Der richtige Weg, um ganz klar ein Vektor oder deque
Können wir nur
container.resize()
verwenden undcontainer.clear()
für die oben genannte Aufgabe oder bin ich etwas fehlt?
Lösung
Es gibt zwei verschiedene Dinge, die ein Vektor gilt: size
Vs capacity
. Wenn Sie nur den Vektor resize
, gibt es keine Garantie, dass die Kapazität (wie viel Speicher reserviert) muss sich ändern. resize
ist eine Operation, die sich mit wie viel werden Sie verwenden, nicht, wie viel der Vektor Kapazität ist.
So zum Beispiel.
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
Am Ende Kapazität soll nicht auf jedem Betrieb geändert, denn das ist eine Menge Speicherzuweisung / Deallokation Kopf bringen würde. Er sagt, dass, wenn Sie brauchen, um " ausplanen " Speicher reserviert durch den Vektor, das tun.
Andere Tipps
Weder Resize () noch klar () Arbeit. Die .capacity()
eines Vektors ist garantiert mindestens so groß wie der Strom des Vektors size()
sein, und zumindest so groß wie die reserve()
d Kapazität garantiert werden. Auch dann, wenn dieser .capacity()
nicht schrumpfen, so dass es auch mindestens so groß wie jeder vorheriger size()
oder reserve()
ation ist.
Nun wird der .capacity()
eines Vektors ist nur die Erinnerung es vorbehalten hat. Oft nicht alle, dass der Speicher cotains Objekte. Ändern der Größe entfernt Objekte, aber nicht recyceln nicht auf den Speicher. Ein Vektor kann nur seine Speicherpuffer recyclen, wenn eine größere Puffer zuordnet.
Der Swap-Trick funktioniert durch Kopieren aller ojekte zu einem kleineren, geeigneten Speicherpuffer. Danach kann der ursprüngliche Speicherpuffer zurückgeführt werden. Dies scheint die vorherige Anweisung zu verletzen, dass der Speicherpuffer eines Vektors nur wachsen kann. Doch mit dem Swap-Trick, Sie vorübergehend haben 2 Vektoren.
Der Vektor hat Größe und Kapazität. Es kann X-Elemente haben aber nicht initialisierten Speicher im Speicher für Y-Elemente mehr halten. In einer typischen Implementierung Lösch- Resize (wenn kleinere Größe Ändern der Größe) und klar wirken sich nicht auf die Kapazität. Der Vektor den Speicher um für sich selbst hält, sollten Sie neue Objekte, um es zu einem späteren Zeitpunkt hinzufügen möchten