Wie ist der dynamischen Speicher verwaltet, die in std::vector?
Wie funktioniert std::vector implementiert das management der sich verändernden Anzahl der Elemente: ist es verwenden, realloc () - Funktion, oder ist es eine verknüpfte Liste?
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es nutzt die Zuweisung gegeben wurde, ihn als zweiten template-parameter. Wie diese dann. Sagen, es ist in push_back, lassen
t
werden, die das Objekt geschoben werden:Sowas. Die Zuweisung kümmert sich um Zuweisung von Speicher. Er hält die Schritte der allokierung von Speicher und dem Bau-Objekt an, in das Gedächtnis auseinander, so kann es preallocate Speicher, aber noch nicht rufen Konstruktoren. Während der Umprogrammierung, der Vektor hat Sorge zu tragen, über Ausnahmen wird ausgelöst, indem Sie copy-Konstruktoren, das erschwert die Sache etwas. Das obige ist nur einige pseudo-code-snippet - nicht real code und enthält wahrscheinlich viele bugs. Wenn die Größe wird über die Kapazität, es fordert die Zuweisung zuweisen eine neue größerer block von Speicher, wenn nicht dann ist es nur Konstrukte, die mit dem zuvor zugewiesenen Speicherplatz.
Die genaue Semantik dieser hängt von der Zuweisung. Wenn es die standard-Zuweisung, konstruieren tun
Und die Zuweisung
allocate
wird nur erhalten Speicher aus::operator new
.destroy
ruft den DestruktorAlle, die abstrahiert hinter der Zuweisung und der Vektor nur verwendet es. Ein Stapel-oder pooling-Zuweisung könnten komplett unterschiedlich arbeiten. Einige wichtige Punkte zur
vector
wichtig sindreserve(N)
Sie können bis zu N Elemente eingefügt, die in dem Vektor ohne die Gefahr einer Umverteilung. Bis dann, das ist, solangesize() <= capacity()
, Referenzen und Iteratoren auf Elemente der it bleiben weiterhin gültig.Eines der hart-und-schnell Regeln, die von den Vektoren ist, dass die Daten gespeichert werden in einem zusammenhängenden block im Speicher.
Diese Weise wissen Sie, Sie können theoretisch so machen:
Ihnen dann passieren kann pWidgetArrayBegin in Funktionen, die möchten, die ein array als parameter.
Die einzige Ausnahme ist der std::vector<bool> Spezialisierung. Es ist eigentlich nicht bools, aber das ist eine andere Geschichte.
Also die std::vector reservieren des Speichers und wird nicht verwenden Sie eine verknüpfte Liste.
Bedeutet dies, dass Sie können Schießen selbst in den Fuß durch, dies zu tun:
Für alles, was Sie wissen, ist die push_back Aufruf verursacht haben könnte die Vektor-Verschiebung dessen Inhalt zu einem völlig neuen block-Speicher, der Aufhebung von pInteresting.
Den Speicher verwaltet
std::vector
ist garantiert kontinuierliche, so dass Sie behandeln können&vec[0]
als einen Zeiger auf den Anfang des dynamischen Arrays.Angesichts dieser, wie es tatsächlich gelingt es Umschichtungen ist die Umsetzung-spezifisch.
std::vector gespeicherten Daten in zusammenhängende Blöcke im Speicher.
Nehmen wir an, wir deklarieren Sie einen Vektor als
std::vector intvect;
Also zunächst einen Speicher von x-Elemente erstellt werden . Hier x ist die Umsetzung abhing.
Wenn der Benutzer ist das einfügen von mehr als x Elemente als ein neuer Speicherblock erstellt von 2x (doppelt so groß) - Elemente und erste Vektor kopiert wird, in diesem Speicherblock.
Deshalb ist es immer empfehlenswert, zu reservieren Speicher für Vektor durch den Aufruf von reserve
Funktion.
intvect.reserve(100);
so können Sie vermeiden, löschen und kopieren von Vektor-Daten.