2009-10-29 9 views
17

Wenn std :: vector und Freunde selbst Redimensionierung sind, bedeutet, dass, wenn ich einen Vektor wie so erklären:STL-Containern auf dem Stack und dem Heap

std::vector<string> myvec; 

Dann wird es mehr Stapel resize verwenden, während :

std::vector<string> *myvec = new std::vector<string>(); 

Würde die Größe mit mehr Heap ändern?

+2

Sie können auch einen Vektor 'fester Größe' implementieren, um all dies auf dem Stapel zu speichern. Es funktioniert ganz gut und kann eine Optimierung sein. Die Kosten sind jedoch, dass es nicht unendlich erweiterbar sein wird> Sie müssen sich mit einem Höchstwert begnügen, und es wird immer so viel Platz verbrauchen. –

+0

Das ist interessant, also ist ein Vektor "fester Größe" vollständig auf dem Stapel? – Benj

+1

Ich kenne keinen Vektor mit 'fester Größe', aber wenn Sie Ihre festen Daten auf dem Stack haben wollen, sollten Sie std :: tr1 :: array verwenden, was ähnlich zu sein scheint. – stefaanv

Antwort

24

Vektoren zuweisen auf dem Haufen in ihren Interna.

Das einzige, was Sie im Stack für einen Stack-basierten Bector bezahlen, sind ein paar Bytes, der innere Puffer wird immer vom Heap zugewiesen.

So effektiv, wenn Sie einen vec = new vector() tun Sie eine kleine Menge zuweisen, die nicht wirklich gut sein kann.

+0

Ah ok, also löschen Vektoren, die auf dem Stack deklariert sind, den Speicher, den sie benutzt haben, sobald sie den Bereich verlassen haben? – Benj

+0

@Benj: Ja, sie werden den Speicher aufräumen, wenn sie außerhalb des Bereichs gehen. – Naveen

+6

@Benj: Beachten Sie, dass Vektoren nur den Speicher räumen, den sie selbst zugewiesen haben. Wenn Sie einem Vektor zugewiesene Heap-Objekte (mit 'neu') hinzufügen, sind Sie für das Aufrufen von 'delete' verantwortlich. Vielleicht wusstest du das schon, aber ich wollte es nur für den Fall erwähnen ... – StackedCrooked

1

std :: vector hat immer seinen Puffer auf Heap zugewiesen. Unabhängig davon, wo der Vektor selbst zugewiesen wird, wirkt sich die Größenanpassung nur auf den Heapspeicher aus.

8

Im ersten Fall erstellen Sie den Vektor auf Stapel. Das bedeutet nicht, dass sich alle internen Objekte der Vektoren ebenfalls auf dem Stapel befinden. Tatsächlich reserviert vector immer noch den Speicher, der benötigt wird, um die Objekte nur auf dem Heap zu halten. Das liegt daran, dass Sie wissen sollten, wie viele Objekte Sie erstellen möchten. Da diese Informationen nicht verfügbar sind, besteht die einzige verbleibende Option darin, den Speicher für das enthaltene Objekt vom Heapspeicher zuzuordnen.

+0

Es sollte auch beachtet werden, dass es für std :: string üblich ist, einige seiner internen "Objekte" auf dem Stapel zu behalten. Ist das eigentlich std :: vector verboten? –

Verwandte Themen