[c++] Wann ist es am besten, den Stack anstelle des Heaps zu verwenden und umgekehrt?


Answers

Als Faustregel gilt es, große Objekte auf dem Stapel zu vermeiden.

  • Das Erstellen eines Objekts auf dem Stapel befreit Sie von der Last, sich zu erinnern, das Objekt zu bereinigen (zu lesen). Wenn Sie jedoch zu viele Objekte auf dem Stapel erstellen, erhöht sich die Wahrscheinlichkeit eines Stapelüberlaufs.
  • Wenn Sie Heap für das Objekt verwenden, erhalten Sie so viel Speicher, wie das Betriebssystem bereitstellen kann. Das ist viel größer als der Stack, aber Sie müssen sicherstellen, dass Sie den Speicher freigeben, wenn Sie fertig sind. Wenn Sie zu häufig zu viele Objekte im Heap erstellen, wird der Speicher häufig fragmentiert, was sich wiederum auf die Leistung Ihrer Anwendung auswirkt.
Question

Wann ist es in C ++ am besten, den Stack zu verwenden? Wann ist es am besten, den Heap zu verwenden?




Die Frage ist schlecht formuliert.

Es gibt Situationen, in denen Sie den Stapel benötigen, andere, wo Sie den Heap benötigen, andere, wo Sie den statischen Speicher benötigen, andere, wo Sie die Speicherdaten benötigen, andere, wo Sie den kostenlosen Speicher benötigen.

Der Stapel ist schnell, da die Zuweisung nur ein "Inkrement" über den SP ist und die gesamte "Zuweisung" zum Aufrufzeitpunkt der Funktion erfolgt, in der Sie sich befinden. Heap (oder freier Speicher) Zuordnung / Freigabe ist zeitaufwendiger und fehleranfällig .




Als Faustregel verwenden Sie den Stapel wann immer Sie können. dh wenn die Variable außerhalb dieses Bereichs nie benötigt wird.

es ist schneller, verursacht weniger Fragmentierung und vermeidet die anderen Gemeinkosten, die mit dem Aufruf von malloc oder new verbunden sind. Aus dem Stapel gibt es einige Assembler-Operationen, malloc oder neu sind mehrere hundert Codezeilen in einer effizienten Implementierung.

es ist nie besser, den Haufen zu benutzen ... einfach unvermeidbar. :)




Eine Ausnahme von der oben genannten Regel, dass Sie den Stack generell für lokale Variablen verwenden sollten, die außerhalb des Funktionsumfangs nicht benötigt werden:

Rekursive Funktionen können den Stack-Space erschöpfen, wenn sie große lokale Variablen zuweisen oder wenn sie rekursiv mehrfach aufgerufen werden. Wenn Sie eine rekursive Funktion verwenden, die Speicher verwendet, ist es möglicherweise eine gute Idee, Heap-basierten Speicher anstelle von stapelbasiertem Speicher zu verwenden.




Links



Tags

c++ c++