c ++ Vector, was passiert, wenn der Stack erweitert / neu zugewiesen wird?
Ich bin neu in C ++ und verwende die Vektorklasse für mein Projekt. Ich fand es ziemlich nützlich, weil ich ein Array haben kann, das automatisch neu zuordnet, wann immer es notwendig ist (dh wenn ich ein Element zurückschieben möchte und der Vektor seine maximale Kapazität erreicht hat, ordnet es sich neu zu und fordert mehr Speicherplatz für das Betriebssystem an) Der Zugriff auf ein Element des Vektors ist sehr schnell (es ist nicht wie bei einer Liste, bei der ich die ersten "n" Elemente durchgehen muss, um das "n-te" Element zu erreichen).
ich fanddiese Frage sehr nützlich, weil ihre Antworten perfekt erklärten, wie die"Speicherzuweiser" funktioniert, wenn ich meinen Vektor auf dem Heap / Stack speichern möchte:
[1] vector<Type> vect;
[2] vector<Type> *vect = new vector<Type>;
[3] vector<Type*> vect;
Ein Zweifel nervt mich jedoch eine Weile und ich kann seine Antwort nicht finden: Immer wenn ich einen Vektor konstruiere und anfange zu pushenviel von Elementen in würde es einen Moment erreichen, in dem der Vektor voll wäre. Um also weiter zu wachsen, müsste er sich neu zuordnen, an einen neuen Speicherort kopieren und dann weiter Elemente zurückschieben (offensichtlich ist diese Neuzuordnung bei der Implementierung der Klasse verborgen) , so ist esvöllig transparent mir)
Gut, wenn ich den Vektor auf dem Heap erstellt habe [2], habe ich keine Probleme damit, mir vorzustellen, was passieren könnte: Klassenvektor ruft malloc auf, erwirbt neuen Speicherplatz und kopiert sich dann in den neuen Speicher und löscht schließlich den alten Speicher, der frei ruft.
Ein Schleier verbirgt jedoch, was passiert, wenn ichkonstruiere einen Vektor auf dem Stapel [1]: Was passiert, wenn der Vektor sich neu zuordnen muss? AFAIK: Wenn Sie unter C / C ++ eine neue Funktion eingeben, überprüft der Computer die Variablendeklaration und anschließenderweitern der Stapel, um den erforderlichen Speicherplatz zum Speichern dieser Variablen zu erhalten, aber Sie können nicht mehr Speicherplatz auf dem Stapel zuweisen, wenn die Funktion bereits ausgeführt wird. Wie löst der Klassenvektor dieses Problem?