2015-07-30 22 views
8

Vorrei trovare un modo per memorizzare più std::vectors, ciascuna di una diversa, ma nota e di dimensioni ragionevolmente piccole, in memoria contigua. Mi rendo conto che potrei scrivere la mia classe, dire con un array molto grande e con puntatori all'inizio di ogni sottosezione della matrice all'interno della matrice più grande trattata come un'entità separata, ma sembra che ci dovrebbe essere un modo più intelligente per fare questo .Allocazione memoria attigua per diversi piccoli std :: vector?

C'è un modo per utilizzare allocators, ad esempio, per creare contiguo std::vectors? Mi piacerebbe non reinventare la ruota solo perché voglio questa località di memoria altrimenti normale std::vectors

Non so nemmeno come iniziare la codifica. Devo creare un allocatore che tenga un puntatore alla memoria, assegni un vettore lì, e poi in qualche modo restituisca l'indirizzo della fine di quel vettore, così l'allocatore successivo di std::vector potrebbe afferrarlo e farlo di nuovo. Come può un allocator restituire un valore?

+2

Sì, è possibile utilizzare gli allocatori per eseguire questa operazione. Che cosa hai provato? Mostra il tuo lavoro :) – Andrew

+0

@Andrew Ho aggiunto qualcosa nella mia domanda, ma non so da dove cominciare. Non ho lavorato con gli allocatori, e finora tutto ciò che ho fatto è leggere le sezioni di Josuttis nel suo riferimento STL. – sunny

+1

Per caso, le dimensioni sono note al momento della compilazione? – dasblinkenlight

risposta

1

La soluzione è @short_alloc di HowardHinnant. Voglio allocare sull'heap quindi usare new, *** ma altrimenti il ​​codice postato da Howard fa esattamente quello che voglio.

template <std::size_t N> 
class arena 
{... 
char* buf_ = new char[N] 
// still need to align this but not sure of the syntax 
// to do that with a new statement 
... 

Il pezzo mancante dal mio punto di vista, quando ho fatto la domanda era che allocators può avere constructors che accettano argomenti:

constexpr int N = 1000*sizeof(int); 
arena<N> myArena; 
std::vector<int, short_alloc<int, N>> x(MyArena); 

ho trovato il codice di riferimento in un altro SO postale: Questions about Hinnant's stack allocator che è stato riferito da il post CodeReview suggerito da Chris Drew nel suo commento sopra. Grazie a tutti.

*** Il codice fa uso new nel metodo allocate, lasciando me incerto se questo è allocato sullo stack (come appare dalla dichiarazione di buf_ *) o sul mucchio (uso di new) ...

0

Per il vostro requisito, implementerei l'allocatore personalizzato che estende std :: allocator e overrides allocate, metodo deallocate che afferra i chunk da un pool di memoria. Se conosci già la dimensione massima richiesta, la selezione della dimensione del pool di memoria non dovrebbe essere un problema.

+0

Sì, sono d'accordo, questa è la strategia che ho indicato nella mia domanda iniziale, ma non ero chiaro su come eseguirlo con un allocatore. La soluzione che ho postato qui fa quello che volevo. – sunny

+0

Se si desidera allocare in pila, dare un'occhiata alla memoria di acquisizione con alloca integrata. L'allocatore personalizzato ha la scelta da cui prelevare il pool di memoria. Spero che sia d'aiuto. Poiché questo alloca sullo stack, verrebbe automaticamente scartato al momento del reso. – kchoi