Libreria di allocatori di memoria gerarchica per C ++
-
08-07-2019 - |
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 .
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?