Hierarchisches Speicherzuordnungsbibliothek für C ++
-
08-07-2019 - |
Frage
Meine Anwendung ist meist organisiert in Schichten , so fand ich, dass so etwas wie das April Speicherpools wäre der beste Weg sein.
Beim Lesen auf SO über C++ placement new
Beiträge hier & hier und eine allgemeinere C Zuteilung Frage ich dachte an Hand Crafting eine hierarchische Pool Allocator wie in einem Beitrag vorgeschlagen, aber in der reinen Tradition NYI ich frage zunächst, ob so etwas wie dies bereits vorhanden ist.
Es könnte auch die schöne Eigenschaft in der Lage, nicht genutzte Speicher an das Betriebssystem zurück zu geben (da Zuordnung mit mmap(MAP_ANON)
getan werden könnte) oder könnte sein, vom Stapel Zuteilung wie vorgeschlagen Ferrucico < a href = "https://stackoverflow.com/questions/362953/what-are-uses-of-the-c-construct-placement-new/363537#363537"> hier .
Lösung
Ich weiß von einem anderen guten hierarchischen Speicherzuordner, aber es ruft malloc
unter die Decke.
talloc ist ein hierarchisches Pool basierten Speicherzuordner mit Destruktoren. Es ist der Kern Speicherzuordner in Samba4 verwendet, und hat einen großen Unterschied in vielen Aspekten der Samba4 Entwicklung.
Um mit talloc zu beginnen, würde ich empfehlen, lesen Sie die talloc Führung .
Dass gesagt wird, Glibc der malloc
bereits verwendet mmap(MAP_ANON)
für die Zuteilung größer als mmap_threshold
, die Sie über mallopt(M_MMAP_THRESHOLD, bytes)
einstellen. Standardmäßig wird es zwischen
/*
MMAP_THRESHOLD_MAX and _MIN are the bounds on the dynamically
adjusted MMAP_THRESHOLD.
*/
#ifndef DEFAULT_MMAP_THRESHOLD_MIN
#define DEFAULT_MMAP_THRESHOLD_MIN (128 * 1024)
#endif
#ifndef DEFAULT_MMAP_THRESHOLD_MAX
/* For 32-bit platforms we cannot increase the maximum mmap
threshold much because it is also the minimum value for the
maximum heap size and its alignment. Going above 512k (i.e., 1M
for new heaps) wastes too much address space. */
# if __WORDSIZE == 32
# define DEFAULT_MMAP_THRESHOLD_MAX (512 * 1024)
# else
# define DEFAULT_MMAP_THRESHOLD_MAX (4 * 1024 * 1024 * sizeof(long))
# endif
#endif
Sehen Sie, wenn Sie es zu senken; standardmäßig nicht mehr als #define DEFAULT_MMAP_MAX 65536
Stücke werden mit mmap
zugeordnet werden. Dies kann mit mallopt(M_MMAP_MAX, count)
geändert werden, aber mit vielen mmap
s hat einen Overhead.
Die Umgebungsvariablen MALLOC_MMAP_THRESHOLD_
usw. werden auch diese Optionen festlegen.
Offensichtlich Speicher dass malloc
mit mmap
ordnet mit munmap
befreit. Ich bin mir nicht sicher, ob irgendetwas davon irgendwo außerhalb von Glibc Quellcode dokumentiert ist, oder hat keine Kompatibilität gewährleistet.
Andere Tipps
Dave Hanson C Schnittstellen und Realisierungen eine sorgfältig abgestimmte Einzel Pool Allocator hat . Sie könnten sie miteinander verknüpfen, um ein hierarchisches allocator zu machen, was einfacher wäre, als Ihre eigenen von Grunde auf neu rollen.
Sie tun Profilierungs Ergebnisse haben, die Speicherverwaltung zeigen, ist ein wesentlicher Engpass, nicht wahr? Oder versuchen Sie nur die API für die Zuordnung zu vereinfachen?