Wie erkennt man, ob sich ein Objekt auf dem Stapel befinden soll oder nicht?

7

Ich habe nach einer Faustregel für das Zuweisen von Objekten auf Stapel oder Heap in C ++ gesucht. Ich habe viele Diskussionen hier über SO gefunden. Viele Leute sagten, es geht um die Lebensdauer eines Objekts. Wenn Sie eine längere Lebensdauer benötigen als den Funktionsumfang, fügen Sie sie in den Heap ein. Das macht vollkommen Sinn.

Aber was mich verwirrend gemacht hat, ist, wie viele Leute sagten, Objekte zu stapeln, wenn sie klein sind. Wenn Objekte groß sind, lege sie auf den Haufen. Aber keiner von ihnen sagte, wie man ein Objekt identifizieren kann, ist groß oder nicht?

Ich habe die folgenden Fragen,

  1. Wie kann man ein Objekt identifizieren oder nicht?
  2. Was wird die maximale Größe des Stapels sein? Jedes Betriebssystem wird eine andere Stapelgröße haben?
  3. Ich habe eine Wrapper-Klasse, die vector<string> umschließt. Es wird rund 100 Artikel haben. Wird es einen Stapel überlaufen lassen, wenn ich diese Klasse einem Stapel zuteile? Ich habe es versucht, aber es hat perfekt funktioniert. Nicht sicher, dass ich etwas falsch mache.
Navaneeth K N 06.03.2009, 02:11
quelle

6 Antworten

10

Nun zuerst Vektoren (und alle STL-Container-Klassen) immer aus dem Haufen zuweisen, so dass Sie sich nicht darum kümmern müssen. Für jeden Container mit einer variablen Größe ist es ziemlich unmöglich, den Stapel zu verwenden.

Wenn Sie darüber nachdenken, wie die Stapelzuordnung funktioniert (zur Kompilierzeit, im Grunde durch Inkrementieren eines Zeigers für jedes Objekt), sollte klar sein, dass Vektorspeicher vom Heap kommt.

%Vor%

Wenn Sie sich nicht in einer rekursiven Funktion befinden, können Sie mehrere Kilobyte Daten ohne große Bedenken auf den Stapel legen. Stack-Größen werden vom Programm (nicht vom Betriebssystem) gesteuert und der Standardwert liegt zwischen 32 KB und 1 MB. Die meisten Desktop-Software kommt in der 1mb-Palette.

Individuelle Objekte sind fast nie ein Problem. Im Allgemeinen sind sie entweder klein genug für den Stack oder werden intern vom Heap zugewiesen.

Wenn Objekte für eine Funktion lokal sind, legen Sie sie auf den Stapel. Wenn sie nicht auf den Haufen gelegt werden.

Verwenden Sie den Heap für große Puffer, die Sie zum Laden / Sortieren / Bearbeiten von Daten zuweisen.

    
Andrew Grant 06.03.2009, 02:18
quelle
4

Laut MSDN wird die Stackgröße standardmäßig auf 1 MB festgelegt. (Dies ist offensichtlich für Msdev.)

Wie Sie dem Artikel entnehmen können, können Sie die Stapelgröße zur Kompilierzeit mit dem Flag / F ändern.

Ich denke, Ihre erste Richtlinie für die Verwendung von Stack und Heap ist ziemlich genau, mit der Einschränkung, dass wenn Sie temporär eine Scope-Variable größer als ein mb ist, diese auf den Heap setzen (und wahrscheinlich fragen, warum Sie so viel Speicher für einen kurze Zeit an erster Stelle).

    
RedBlueThing 06.03.2009 02:16
quelle
3

Die einzige Möglichkeit, große Objekte auf dem Stapel zuzuordnen, besteht darin, dass ein Array im alten Stil zu einem bestimmten Zeitpunkt verwendet wird. Zum Beispiel:

%Vor%

Wenn Sie keine Arrays verwenden (und das sollten Sie nicht), werden Ihnen die meisten Dinge auf dem Heap zugewiesen:

%Vor%

das obige reserviert einige Bytes auf dem Stapel für Zeiger, Größeninfo usw. und weist dann den tatsächlichen Speicher auf dem Haufen zu.

Also hör auf dich zu sorgen! Du machst wahrscheinlich Dinge richtig!

    
anon 06.03.2009 02:21
quelle
1
  

Wie man ein Objekt identifizieren kann, ist groß oder nicht?

Hängt von Ihrer Compiler / Plattform-Kombination ab. Es gibt keine Wahre Grenze. Compiler ermöglichen es Ihnen oft, dies zu tunen.

  

Was ist die maximale Stapelgröße? Jedes Betriebssystem hat eine andere Stapelgröße?

Hängt meistens wie oben. Nur, dass Sie weniger Kontrolle über das Tuning haben.

  

Ich habe eine Wrapperklasse, die Vektor umschließt. Es wird rund 100 Artikel haben. Wird es einen Stapel überlaufen lassen, wenn ich diese Klasse einem Stapel zuteile? Ich habe es versucht, aber es hat perfekt funktioniert. Nicht sicher, dass ich etwas falsch mache.

Funktioniert so lange, wie die Gesamtspeicheranforderung dieses Wrappers und anderer Objekte in diesem Block die Stapelrahmengröße nicht überschreitet. Was wiederum von der durchschnittlichen Zeichenkette abhängt.

Eine gute Idee ist es, einen Debugger zu durchlaufen und die Stack-Adressen zu sehen - das gibt Ihnen einen gewissen Anfang der Breite. Und die Dokumentation.

    
dirkgently 06.03.2009 02:17
quelle
1

1. Wie kann man ein Objekt identifizieren oder nicht?

Verwenden Sie "sizeof"

%Vor%

int size = Größe von (c);

Auf meiner Maschine ist "Größe" 16 Bytes.

2. Was wird die maximale Stapelgröße sein? Jedes Betriebssystem hat eine andere Stapelgröße?

Sie können es nicht sagen, aber es ist definitiv kein guter Ort, um Massen von Daten zuzuordnen.

3. Ich habe eine Wrapper-Klasse, die Vektor umschließt. Es wird rund 100 Artikel haben. Wird es einen Stapel überlaufen lassen, wenn ich diese Klasse einem Stapel zuordne? Ich habe es versucht, aber es hat perfekt funktioniert. Nicht sicher, dass ich etwas falsch mache.

Nein. std :: vector weist die 100 Elemente im Heap zu.

    
Jimmy J 06.03.2009 06:25
quelle
1

Noch ein Punkt, den ich erwähnen möchte ist, dass vector<> in der Lage sein muss, sich selbst zu verändern, wenn es groß genug wird (siehe unten), muss den Heap zum Speichern seiner enthaltenen Objekte verwenden, auch wenn vector<> selbst als Stack-Variable deklariert ist.

[EDIT] Wie Motti in einem Kommentar bemerkt, ist es möglich, dass vector<> eine kleine Menge an Speicherplatz innerhalb seines Stack-allokierten Objekts als Optimierung für kleine Vektoren reserviert. In diesem Fall erfordert das Arbeiten mit Vektoren, die klein genug sind, um in diesen Raum zu passen, keine Heapzuweisungen. (Dieser vorab zugewiesene Speicherplatz muss ziemlich klein sein, um zu vermeiden, dass bei der Arbeit mit kleineren Vektoren Platz verschwendet wird.) Unabhängig davon, ob der Vektor ausreichend groß wird, wird eine (Neu-) Zuweisung auf dem Heap erforderlich sein.

    
j_random_hacker 06.03.2009 02:20
quelle

Tags und Links