Wann überlädst du den Operator neu? [Duplikat]

8

In welchen Fällen ist es sinnvoll, operator new zu überladen?

Ich habe gehört, dass du es in einer Klasse machst, die sehr oft mit new zugewiesen wird. Kannst du ein Beispiel geben?

Und gibt es andere Fälle, in denen Sie operator new überladen möchten?

Update: Danke für alle bisherigen Antworten. Könnte jemand ein kurzes Code-Beispiel geben? Das habe ich gemeint, als ich nach einem obigen Beispiel gefragt habe. Etwas wie: Hier ist eine kleine Spielzeugklasse, und hier ist eine funktionierende operator new für diese Klasse.

    
Frank 31.01.2010, 15:01
quelle

4 Antworten

11

Einige Gründe für die Überlastung pro Klasse
1. Instrumentierung, d. H. Das Verfolgen von Allozierungen, das Protokollieren von Trails für den Aufrufer wie Datei, Zeile, Stapel.
2. Optimierte Zuweisungsroutinen, d. H. Speicherpools, feste Blockzuordner.
3. Spezialisierte Zuweiser, d. H. Zusammenhängender Zuordner für Objekte "einmal beim Start zuweisen" - häufig in Spielen verwendet, die für Speicher programmieren, der für das ganze Spiel bestehen muss usw.

4. Ausrichtung. Dies ist eine große Sache bei den meisten Nicht-Desktop-Systemen, insbesondere in Spielekonsolen, wo Sie häufig z. 16-Byte-Grenzen
5. Spezialisierte Speicher speichert (wieder meist nicht-Desktop-Systeme) wie non-cacheable Speicher oder nicht-lokaler Speicher

    
zebrabox 31.01.2010 15:40
quelle
3

Der beste Fall, den ich gefunden habe, war, die Heap-Fragmentierung zu verhindern, indem mehrere Heaps von Blöcken fester Größe bereitgestellt wurden. dh Sie erstellen einen Heap, der vollständig aus 4-Byte-Blöcken besteht, einen anderen mit 8-Byte-Blöcken usw.

Dies funktioniert besser als der Standard-All-in-One-Heap, da Sie einen Block wiederverwenden können, wobei Sie wissen, dass Ihre Zuweisung in den ersten freien Block passt, ohne den Heap auf der Suche nach einem freien Platz prüfen zu müssen Größe.

Der Nachteil ist, dass Sie mehr Speicher verbrauchen, wenn Sie einen 4-Byte-Heap und einen 8-Byte-Heap haben und 6 Byte zuweisen wollen. Sie müssen es in das 8-Byte-Byte schreiben Heap, verschwenden 2 Bytes. Heutzutage ist dies kaum ein Problem (vor allem, wenn Sie den Overhead von alternativen Schemas berücksichtigen)

Sie können dies optimieren, wenn Sie viele Zuordnungen vornehmen müssen, können Sie einen Heap genau dieser Größe erstellen. Persönlich denke ich, einige Bytes zu verschwenden ist kein Problem (z. B. Sie eine Menge von 7 Bytes zuweisen, die Verwendung eines 8-Byte-Heap ist kein großes Problem).

Wir haben dies für ein sehr leistungsstarkes System getan, und es hat wunderbar funktioniert, es hat unsere Performance-Probleme aufgrund von Allokationen und Heap-Fragmentierung dramatisch reduziert und war für den Rest des Codes vollkommen transparent.

    
gbjbaanb 31.01.2010 15:09
quelle
3

Einige Gründe, Operator new zu überladen

  1. Verfolgung und Profilerstellung von Speicher und Erkennung von Speicherverlusten
  2. Erstellen von Objektpools (z. B. für ein Partikelsystem), um die Speichernutzung zu optimieren
Extrakun 31.01.2010 15:14
quelle
0

Sie tun dies in Fällen, in denen Sie die Speicherzuweisung für ein Objekt steuern möchten. Wie bei kleinen Objekten, die nur auf dem Heap zugewiesen werden, können Sie Speicherplatz für 1k-Objekte zuweisen und den neuen Operator verwenden, um zuerst 1k-Objekte zuzuweisen und den Speicherplatz zu verwenden, bis er aufgebraucht ist.

    
daramarak 31.01.2010 15:14
quelle