Über C/C++ stack-Allokation
Beim lernen von C++ (und C) ich hatte bestimmte Zweifel in Bezug auf die Arbeit von stack-Zuweisung, dass ich nicht finden können, eine Lösung zu:
-
Tut stack-Zuweisung-Aufruf malloc/free Funktionen implizit? Wenn nicht, wie funktioniert es versichern, es gibt keinen Konflikt zwischen stack-Allokation und-heap?
-
Wenn ja; keine stack-Zuweisung in C++ implizit aufrufen von new/delete zu? Wenn ja; keine überlastung der new-operator für eine Klasse auf seinen stack Allokation?
Es ergaben verwirrende Ergebnisse in VC++; als aber VC++ ist nicht ganz standard-konform ist (oder so habe ich gehört) ich entschied, dass ich besser hier Fragen...
- Der Hauptgrund, warum ich hatte die Vermutung war, weil es wird nie erwähnt, wie viel Platz ist eigentlich reserviert für den stack, oder die maximale Größe eines Objekts, beide wurden beantwortet in den Kommentaren..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stack Allokation nicht alles, was wie malloc/free. Es verwendet einen Teil des Speichers aufgerufenen Programm stack, die nur einen zusammenhängenden segment des Speichers.
Gibt es ein spezielles register, in dem die oben auf dem Stapel. Wenn ein neues Objekt erstellt wird auf dem stack oben angehoben wird, wodurch der Stapel, wenn ein Objekt freigegeben wird (geht out of scope) oben abgesenkt wird und somit eine Verringerung der stack.
Wenn Sie versuchen, zu vergeben, zu großes Objekt auf dem stack oder gehen zu tief in die Rekursion die top-hinauswachsen wird die maximal zulässige Größe des Stacks und dies wird als stack-überlauf.
Hinweis: die tatsächliche Richtung des stack-Wachstum (Erhöhung oder Verringerung Adressen) wird je nach system variieren, aber die Allgemeine Idee ist die gleiche, unabhängig von der tatsächlichen Richtung.
Die Antwort auf Ihre erste Frage ist Keine. Stack ist nicht vergeben aus dem Speicher.
Sollten Sie Lesen Was und wo sind die stack und heap erste zu verstehen, die grundlegenden Konzepte.
Stack-Zuweisung erfolgt in der Regel in Bezug auf die alloca() oder implizit durch den compiler.
Ein gelungener alloca() benötigen nur ein paar spärliche Hinweise, und es gibt keine Kosten (oder sogar notwendig) Sie zu befreien, wenn Sie fertig sind.
Übergeben Sie einen Zeiger auf reservierten Speicher durch alloca() zu einer anderen Funktion/Methode, die einen Zeiger erwartet. Sie MÜSSEN NIE wieder ein Zeiger zugewiesen, der durch alloca().
Hier sind einige Vorteile und Nachteile, um mit stack-Allokation.
Es ist eine gute Frage hier:
Gibt es einen einzigen zusammenhängenden Adreßraum in fast allen C/C++ - Implementierungen, so dass der stack-und heap-allozierten Speicher zu tun haben, um gleichzeitig in diesem Raum.
Obwohl jedes mal, wenn der stack wächst und schrumpft, das ist nicht getan mit einzelnen heap-Zuweisungen, können Sie immer noch denken, der den stack wie ein einzelner großer block von Speicher aus dem heap. Wenn der Stapel wächst, jenseits der Grenze, die blockieren, dann haben wir einen stack-overflow " (eingängiger name... sollte jemand den Namen einer website nach dem es).
In einem multi-threaded Programm, jedes mal, wenn ein thread gestartet wird, wird ein neuer stack allokiert werden, und wenn ein thread stirbt, werden die Stapel werden können, freigegeben werden. Und würde es Sinn machen, für diesen ganzen Stapel Blöcke, die zugeteilt werden sollen, mit den gleichen heap-management ausgesetzt ist, durch
malloc
/free
.So ganz ungefähr gesprochen - kann man sich den stack als einen Typ von Objekt, das zusammen im heap. Einen ganzen Stapel ist
malloc
-ed, die alle in einem gehen, wenn ein thread gestartet wird, und dann wird es suballocated aus, und dann wird esfree
-d in einem gehen.Unter Windows können Sie (wenn Sie mögen, gefährlich zu Leben) rufen Sie den gleichen virtuellen Speicher-APIs selbst, um sich über die Stapel und zu zwingen, eine virtuelle Seite, die innerhalb es, befreit zu werden.
In C und C++, es gibt zwei Arten von memory allocation 'Automatik', wo das Objekt erstellt ist und für die Lebensdauer eine Funktion aufrufen, und 'dynamic', wo einige Speicher zugeordnet ist, durch eine Funktion der Laufzeit.
In der überwiegenden Mehrheit der Laufzeit Implementierungen, automatische Objekte zugeordnet sind, über einen zusammenhängenden Stapel, die vom Betriebssystem bereitgestellt wird, wenn der thread erstellt wird. Der stack beginnt in der Regel bei einer hohen geschätzten Adresse und erniedrigt durch die Größe des Objekts. Dynamische Zuweisungen (malloc in C, new in C++) verwenden einige andere Speicher angefordert, die vom Betriebssystem. Als OS kennt die Adressen der stack verwenden, ist es nicht zuordnen die gleichen Adressen für die dynamischen Anforderungen. Der dynamische Bereich ist nicht bestellt, es wird oft als der heap.
So 'stack' Zuweisung nicht malloc/free. Automatische Objekte in C++ Aufruf der Konstruktor-und Destruktor, aber nicht neue oder zu löschen, so neu und lösche auch den code zur Verwaltung von dynamischen Speicher.
Keine stack-Zuweisung, nicht malloc/free. Der gesamte stack-Speicher zugeordnet ist, an den Anfang Ihres Programms. Auf Eintrag, um jede Funktion der stack-pointer ist erweitert genug, um Speicherplatz auf dem stack für eine "stack-frame" werden, wo Sie Ihren stack zugewiesenen Variablen befinden.
Kepp daran, dass "stack-Allokation" ist eine Implementierung detail. Es gibt keine Garantie, dass ein Stapel wird verwendet für die automatische Speicherung. Zum Beispiel, IBM-mainframes der lore nicht (obwohl mir erzählt wurde, Ihre modernen Maschinen tun).