Reputation: 3881
I would like to find a way to store several std::vectors
, each of a different but known and reasonably small size, in contiguous memory. I realize I could write my own class, say with a very large array and with pointers to the start of each subsection of the array within the larger array treated like a separate entity, but it seems like there should be a smarter way to do this.
Is there a way to use allocators
, for example, to create contiguous std::vectors
? I'd like not to reinvent the wheel just because I want this memory-locality of otherwise normal std::vectors
I don't know how to even begin coding. I need to create an allocator that takes a pointer to memory, allocates a vector there, and then somehow passes back the address of the end of that vector, so the next std::vector
's allocator could grab that and do it again. How can an allocator
return a value?
Upvotes: 8
Views: 2151
Reputation: 525
For your requirement, I would implement custom allocator that extends std::allocator and overrides allocate, deallocate method that grabs chunks from a memory pool. If you already know the maximum size required, selecting memory pool size shouldn't be a problem.
Upvotes: 0
Reputation: 3881
The solution is @HowardHinnant's short_alloc. I want to allocate on the heap so have to use new
,*** but otherwise Howard's posted code does exactly what I want.
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
...
The missing piece from my perspective when I asked the question was that allocators
can have constructors
that take arguments:
constexpr int N = 1000*sizeof(int);
arena<N> myArena;
std::vector<int, short_alloc<int, N>> x(MyArena);
I found the code reference in another SO post: Questions about Hinnant's stack allocator which was referenced from the CodeReview post Chris Drew suggested in his comment above. Thank you all.
***
The code does use new
in the allocate
method, leaving me unsure of whether this is allocated on the stack (as it appears from the declaration of buf_*) or on the heap (use of new
)...
Upvotes: 1