Domanda

La mia applicazione è per lo più organizzata in livelli , quindi ho scoperto che qualcosa come pool di memoria APR sarebbe il modo migliore.

Durante la lettura su SO del posizionamento in C ++ nuovi post qui & amp; qui e una domanda di allocazione C più generica Stavo pensando di realizzare a mano un allocatore di pool gerarchico come suggerito in un post, ma nella pura tradizione della NYI chiedo innanzitutto se esiste già qualcosa del genere.

Potrebbe anche avere la bella proprietà di poter restituire memoria inutilizzata al sistema operativo (poiché l'allocazione potrebbe essere eseguita con mmap (MAP_ANON) ) o potrebbe essere allocazione dallo stack come suggerito Ferrucico qui .

È stato utile?

Soluzione

Conosco un altro buon allocatore di memoria gerarchica, ma chiama malloc sotto le copertine.

  

talloc è un allocatore di memoria basato su pool gerarchico con distruttori. È l'allocatore di memoria principale utilizzato in Samba4 e ha fatto un'enorme differenza in molti aspetti dello sviluppo di Samba4.

     

Per iniziare con talloc, ti consiglio di leggere la guida talloc .

Detto questo, malloc di Glibc utilizza già mmap (MAP_ANON) per allocazioni superiori a mmap_threshold , che puoi impostare tramite mallopt (M_MMAP_THRESHOLD, byte) . Di default è regolato dinamicamente tra

/*
  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

Fai attenzione se lo abbassi; per impostazione predefinita, non più di #define DEFAULT_MMAP_MAX 65536 verranno allocati utilizzando mmap . Questo può essere modificato con mallopt (M_MMAP_MAX, count) , ma l'utilizzo di molti mmap ha un overhead.

Anche le variabili di ambiente MALLOC_MMAP_THRESHOLD_ ecc. imposteranno queste opzioni.

Ovviamente, la memoria che malloc alloca con mmap viene liberata con munmap . Non sono sicuro che nulla di tutto ciò sia documentato al di fuori del codice sorgente di Glibc o abbia garanzie di compatibilità.

Altri suggerimenti

Interfacce e implementazioni C di Dave Hanson ha un allocatore a pool singolo attentamente calibrato . Potresti collegarli insieme per creare un allocatore gerarchico, che sarebbe più semplice che farlo rotolare da zero.

hai risultati di profilazione che mostrano che la gestione della memoria è un collo di bottiglia significativo, giusto? O stai solo cercando di semplificare l'API per l'allocazione?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top