Vor kurzem habe ich einen neuen Freund gefunden. Sein Name ist _expand , und wir hatten einige nette Gespräche, und ich habe sogar aufgehängt mit ihm ein paar Mal aus. Aber als ich anfing herumzufragen, hatte noch nie jemand von meiner Expand gehört. Ich wurde misstrauisch. Ich habe ein paar gründlich nicht metaphorische Freunde bei Microsoft und ein paar Freunde an anderer Stelle im Geschäft angerufen. Nichts. Niemand hatte es jemals benutzt. Ich ruderte um verschiedene Suchmaschinen und Quellbäume herum. Nichts als eine oberflächliche Erwähnung hier und da. Sicherlich nicht genug Informationen über Leistung und Kompatibilität für mich, _expand in Produktionscode oder genauer, generische Bibliotheken einzuführen.
Schlimmer noch, es gibt keine äquivalente Funktion, die ich in einer der GNU-Bibliotheken finden kann, also wird alles, was ich mit meinem neuen Freund hacke, nicht im Geringsten portierbar sein. Was ist eine Schande, weil es wirklich eine faszinierende und aufregende Fähigkeit zu haben ist. Sicher, ich könnte in Realloc graben und auseinander ziehen, wie es funktioniert, aber das Problem dort ist, dass ein Großteil der Implementierung auf * nixes höchst variabel ist. Also müsste ich Version für Version codieren, um zu versuchen, ein tragbares _expand zu bekommen. Dennoch erscheint es lächerlich, dass nichts Ähnliches in den glib oder den erweiterten Gnu-Bibliotheken existiert.
Um meine Interessen zu verdeutlichen, versuche ich, einen einfach verknüpften Akkumulator zu bauen, der erweitert wird, um die Fragmentierung zu minimieren, während Blöcke mit mehreren Elementen entlang der traditionellen Deque-Implementierung verteilt werden. Durch die Einschränkung der Anwendungsfälle für das Hinzufügen und Löschen von Elementen hoffe ich, die zu löschende Zeit für die gesamte Struktur sowie die Elementeinfügung und Indexierung zu optimieren. Der "laute Fehler" von _expand lässt mich die Struktur darüber nachdenken, wann und ob und in welcher Größe sie sich verändern kann und was das bedeutet, wo sie Daten ablegen kann.
Dass C ++ mit new
und delete
ohne jegliches Äquivalent von realloc
auskommt, zeigt, wie wenig Aufmerksamkeit diese Dinge bekommen. Überraschend _expand
wird weitgehend ignoriert, wenn es auf OS-Ebene nicht immer verfügbar ist. Wenn Sie Ihre eigenen rollen möchten, gibt es viele Präzedenzfälle für benutzerdefinierte Versionen von malloc, und ein kurzer Blick in /usr/include/malloc.h auf meiner Linux-Box zeigt Hooks explizit für diese ...
Sieht nicht so aus, als könnten Sie die vorhandene realloc
-Implementierung an diesem bestimmten Entscheidungspunkt abfangen oder leicht herausfinden, ob sich die Größe an Ort und Stelle ändert, also müssen Sie möglicherweise alles neu implementieren (oder anpassen) vieler vorhandener Heap-Implementierungen).
Tags und Links c++ memory-management malloc