2011-01-04 6 views
1

Wenn ich std :: vector <> oder std :: string verwende, muss ich sie auch in Heap zuordnen. Beispiel:Sollen wir Speicher für ein Objekt auf Heap reservieren, wenn sein interner Speicher bereits in Heap zugeordnet ist?

In Java und C# werden Objekte immer im Heap mit dieser Syntax zugewiesen. Ich frage mich, ob es effizient ist, in C++ dasselbe zu tun? Denn wenn ich eine Klasse in C++ erzeuge, mische ich normalerweise zwischen Stack- und Heap-Variablen. Lassen Sie uns sagen:

Ich frage mich, was ist die beste Praxis sollte ich folgen, wenn Objekt in C++ verwenden?

  • Alle Daten sollten auf Heap zugeordnet werden?
  • Alle Daten könnten gemischt werden?
  • oder ...

Danke,
Chan

+0

Tatsächlich befinden sich Objekte nicht unbedingt auf dem Heap, der diese Syntax in C# verwendet. Wenn es ein Werttyp ist, wird es auf den Stapel gelegt. –

Antwort

2

Sie sollten es vermeiden, Objekte mit großem Stack zu erstellen, da gelegentlicher Stack-Overflow bei Stress (große Eingabedaten) selten durch Tests aufgedeckt wird und Ihre Endbenutzer damit unzufrieden sind, dass Ihre Software abstürzt.

Über Zeichenfolge und Vektor und andere STL-Container sollten Sie sich keine Sorgen machen, da sie interne dynamische Zuweisung verwenden. Also ist die Antwort NEIN, es ist sicher, sie in einen Stapel zu konstruieren, und es ist normalerweise zu viel Aufwand, sie dynamisch zuzuordnen.

Was gefährlich sein kann, sind Arrays mit statischer Größe, Dinge, die solche Arrays wie boost :: array oder Klassen, die Datenelemente enthalten, einbinden. Experten verwenden Pimpl-Idiom oft, um ihre Klassen intern dynamisch zu machen.

Stapel ist extrem schnell, aber verwenden Sie seine Schnelligkeit nur dort, wo es wirklich die Leistung begünstigt. Es ist sicherer, vorsichtig damit umzugehen. Vermeiden Sie gefährliche Redewendungen wie "Ich ordne alles auf dem Stapel zu".

+0

+1 Guter Rat für die Sicherheit. Eine Plattform, auf der ich entwickle, legt die Standard-Stack-Größe für neue Pthread-Threads auf 64 KB fest. Ich habe dem Neuling in der Vergangenheit den Fehler gemacht, zu große Puffer auf dem Stapel zuzuordnen, was zu allerlei seltsamen Fehlern führt. – axw

+0

@Öö Tiib: Danke;) – Chan

3

Ich versuche, die Objekte auf dem Stapel zuweisen, wann immer möglich, da mache ich mir Sorgen müssen nicht über den Speicher in einem solchen Fall die Freigabe. Nur wenn ich explizit die Lebensdauer eines Objekts kontrollieren will, werde ich das Objekt auf dem Heap zuweisen. Auch wenn das Objekt intern Speicher auf Heap zuweist, können Sie das Objekt selbst auf dem Stapel erstellen. Es gibt keine Einschränkung.

1

Nein; Verwenden Sie den Stapel im Allgemeinen, wenn die Lebensdauer der Variablen nicht die der Funktion überschreitet.

Die Container-Klassen weisen dem Heap ihren eigenen Speicher zu; Die einzigen Daten auf dem Stapel sind die Buchführung, die die Containerklasse benötigt, wie ein Zeiger auf den Kopf, die Größe usw.

Zusätzlich würde ich empfehlen, das manuelle Neu/Löschen und Verwenden von shared_ptr usw. zu vermeiden.

+0

Danke für Ihren Vorschlag! – Chan

Verwandte Themen