Alexandrescu 'ärgerliche Alligator'-Allokator-Implementierung?

Auf der letztjährigen CppCon hielt der wunderbare Andrei Alexandrescu einen Vortrag über das Entwerfen von Speicherzuordnern mit dem (un?) treffenden Namen:

std::allocator ist für Allocation das, was std::vector für Vexation ist

(frühere Titel: "std::allocator is to Allocation what allogator is to Behauptung" oder "writing allocators which don't not work").

Jetzt suche ich nicht nach einer Kopie seines Codes, sondern nach etwas, das darauf basiert, was:

  • Hat die richtige/bessere Unterstützung für die Ausrichtung (hoffentlich über Vorlagenparameter, vielleicht sogar die Ausrichtung in der BlkStruktur enthaltend?).
  • Enthält eine größere Vielfalt bekannter Zuordnungsalgorithmen
  • Wird von mehr als 2 Personen genutzt :-)

Gibt es so etwas da draußen?

Antworten (1)

Ja, das gibt es: Felix Petriconi's

Allocator Builder-Bibliothek (GitHub)

Zitat aus der Repository-Beschreibung:

Ein hochgradig zusammensetzbarer, richtlinienbasierter C++-Zuordner.

Die Layoutidee der Bibliothek wurde von Andrei Alexandrescu auf dem C++ and Beyond 2013 Seminar und auf der CppCon 2015 vorgestellt .

Also genau das, wonach OP gefragt hat. Zusätzliche allgemeine Informationen:

  • Preis : Kostenlos.
  • Lizenz : Die Boost-Softwarelizenz .
  • Gestartet : Oktober 2014
  • Letztes Commit : April 2016

Die ab März 2017 bereitgestellten zusammensetzbaren Zuweisungen sind:

  • affix_allocator : Ermöglicht das automatische Prä- und Suffix zugewiesener Regionen.
  • allocator_with_stats : Ein Allocator, der eine konfigurierte Anzahl statistischer Informationen sammelt, wie die Anzahl der zugewiesenen Bytes, die Anzahl erfolgreicher Erweiterungen und die Flut
  • Bucketizer : Verwaltet eine Reihe von Allocators mit zunehmender Bucket-Größe
  • fallback_allocator : Entweder der Standard-Allocator kann eine Anfrage verarbeiten, andernfalls wird sie an einen Fallback-Allocator übergeben
  • (aligned_)mallocator : Bietet eine Schnittstelle zu Systemen ::malloc(), die ausgerichtete Variante weist gemäß einer gegebenen Ausrichtung zu null_allocator Ein Null-Zuordner
  • segregator : Trennt Zuweisungsanfragen abhängig von einem Schwellenwert an Zuordner A oder B
  • (shared_)freelist : Verwaltet eine Liste freigegebener Speicherblöcke in einer Liste zur schnelleren Wiederverwendung. (Die Shared-Variante ist threadsicher)
  • (shared_)cascading_allocator : Verwaltet Thread-sicher Allocators und erstellt automatisch einen neuen, wenn der vorherige nicht mehr genügend Speicher hat. (Die Shared-Variante ist Thread-sicher, muss aber weiter verbessert werden, da sie keine ungenutzten Zuweisungen freigibt.)
  • (shared_)heap : Ein auf Heapblöcken basierender Heap. (Die Shared-Variante ist Thread-sicher mit minimalem Overhead und weitestgehend Lock-frei.)
  • stack_allocator : Stellt einen Speicherzugriff bereit, der vom Stack genommen wird

Es ist also eine solide Basis, um loszulegen. Auch viele GitHub-Stars und Follower.