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 .

War es hilfreich?

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

dynamisch angepasst
/*
  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 mmaps 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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top