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.
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
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.
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.
Tags und Links c++ new-operator memory-management object operators