2016-08-01 38 views
5

ich eine Klasse A haben die Membervariablen der Typen M und N. hat die Lebensdauer dieser Objekte sollen durch die Lebensdauer von A. begrenzt werdenIntelligente Zeiger vs. Wert als Membervariablen

Ich bin unter Berücksichtigung

class A { 
    M member1; 
    N member2; 
} 

gegen

class A { 
    std::unique_ptr<M> member1; 
    std::unique_ptr<N> member2; 
} 

ich bin nicht ganz sicher, was besser ist, da sie beide zu erreichen, was ich will. Die Lebensdauer der Mitglieder ist an das Objekt gebunden, und ich muss den Speicher nicht manuell verwalten. Was sind die Vor- und Nachteile jedes Setups?

+5

Wenn es keinen Grund gibt, einen Zeiger zu haben, warum einen Zeiger haben? Alle Mitglieder sind im Destruktor "zerstört". – NathanOliver

+0

Die * einzige * Zeit, in der Sie 'M' und' N' als Zeiger erzeugen möchten, wäre dort, wo sie sehr groß sind. Wenn Sie sie auf dem Stapel erstellen, könnte der Stapelspeicher leer sein. –

+2

Verwenden Sie die dynamische Zuweisung nur habe einen guten Grund und einen guten Grund. Zum Beispiel, wenn Ihre Mitgliederobjekte gigantisch sind und den Stapel zerstören könnten. Andernfalls führen Sie den Overhead der dynamischen Zuordnung/Indirektion nicht sinnlos ein. –

Antwort

2

Es hängt von der Größe der Typen N und M ab und wie Sie planen, class A zu verwenden.

  1. Wenn Typen N und M klein sind, das heißt ein Maschinenwort, dann den zusätzlichen Overhead mit der Schaffung und Aufrechterhaltung Zeiger ist eine Verschwendung von Zeit und Raum.
  2. Wenn die Typen N und M sehr groß sind und Sie planen, ein Objekt class A auf Stapel zu deklarieren, dann wäre es besser, Zeiger zu verwenden. In diesem Fall werden die großen Objekte der Typen N und M im Heap-Bereich zugeordnet (und verhindern höchstwahrscheinlich, dass Sie sehr unangenehme Probleme beim Stack-Überlauf beheben können).
  3. Wenn Sie andererseits planen, ein Objekt von class A dynamisch zuzuweisen, dann ist es ausreichend, Member-Variablen zu haben, da in diesem Fall alles im Heap-Bereich zugewiesen wird und Sie auch den Overhead sparen.

Hoffe, das ist klar.

4

Verwendung std :: unique_ptr wenn

  1. M und N sind Basisklassen von polymorphen Hierarchien
  2. member1 und member2 optional Mitglieder sind die nullptr werden können
  3. M und N sind groß genug, was nicht sein kann zugeordnet auf Programmstapel
+0

Und das sind ** alle ** die Daumenregeln und Vorkommen? –

3

Yep, sind beide richtig, aber ...

Im Allgemeinen gibt es zusätzliche Kosten, um die Objekte dynamisch zuzuweisen oder sie als einfache Elemente zu speichern. Sie müßten den edtra-Overhead der Zuweisung von Theor-Speicher aus dem Free-Store bezahlen, anstatt einfach das für das A, dem sie angehören, zugewiesene Memroy zu verwenden. Sie hätten auch einen indirekten Verweis, wann immer Sie auf sie zugreifen wollten.

Sie immer noch könnte die intelligente Zeiger Route gehen wollen, wenn die Kosten Sie etwas kauft. Beispiel:

  1. Möglicherweise möchten Sie die Werte von member1 oder member2 während der gesamten Lebensdauer eines A-Objekts ändern. Die Smart-Pointer-Methode könnte eine billige Operation machen, wenn M- und N-Objekte groß sind.
  2. Vielleicht möchten Sie Polymorphie nutzen.Wenn M oder N eine Basisklasse wäre, hätte die zeigerbasierte Implementierung die Flexibilität, Unterklassen von M oder N zu verwenden. Die zeigerbasierte Implementierung könnte es erlauben, die Zuweisung von member1 oder member2 bis zu einem späteren Zeitpunkt zu verzögern. Zeit im Lebenszyklus der A.