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


Answers

Vermeiden Sie es als Faustregel, riesige Objekte auf dem Stapel zu erstellen.

  • Das Erstellen eines Objekts auf dem Stapel befreit Sie von der Last des Erinnerns, das Objekt aufzuräumen (das Löschen zu löschen). Wenn Sie jedoch zu viele Objekte auf dem Stapel erstellen, erhöhen Sie die Wahrscheinlichkeit eines Stapelüberlaufs.
  • Wenn Sie Heap für das Objekt verwenden, erhalten Sie soviel Arbeitsspeicher, wie das Betriebssystem bereitstellen kann, viel größer als der Stack, aber dann müssen Sie sicherstellen, dass der Speicher freigegeben wird, wenn Sie fertig sind. Wenn Sie zu viele Objekte zu häufig im Zwischenspeicher erstellen, wird der Speicher 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 geformt.

Es gibt Situationen, in denen Sie den Stack benötigen, andere, wo Sie den Heap benötigen, andere, wo Sie den statischen Speicher benötigen, andere, wo Sie die konstanten Speicherdaten benötigen, andere, wo Sie den freien Speicher benötigen.

Der Stapel ist schnell, weil die Zuweisung nur ein "Inkrement" über dem SP ist, und die gesamte "Zuweisung" wird zum Aufrufzeitpunkt der Funktion ausgeführt, in der Sie sich befinden. Heap (oder freier Speicher) Zuweisung / Freigabe ist zeitaufwendiger und fehleranfälliger ..




Verwenden Sie den Heap nur für die Zuweisung von Speicherplatz für Objekte zur Laufzeit. Wenn Sie die Größe zur Kompilierzeit kennen, verwenden Sie den Stapel. Statt Heap-allokierte Objekte von einer Funktion zurückzugeben, übergeben Sie einen Puffer an die Funktion, in die er schreiben kann. Auf diese Weise kann der Puffer zugewiesen werden, wobei die Funktion als ein Array oder eine andere stapelbasierte Struktur aufgerufen wird.

Je weniger malloc () -Anweisungen Sie haben, desto geringer sind die Chancen für Speicherlecks.




Eine Ausnahme von der oben erwähnten 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 mehrmals rekursiv aufgerufen werden. Wenn Sie über eine rekursive Funktion verfügen, die Arbeitsspeicher verwendet, empfiehlt es sich, Heap-basierten Speicher anstelle von stapelbasiertem Speicher zu verwenden.





Tags