1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
#include <cstddef>
template< class Type
, std::size_t Size = 1024*1024
, std::size_t ID = sizeof(Type)
>
struct heapless_allocator
{
static Type* allocate()
{
if( next+sizeof(Type) <= end )
{
Type* mem = new(next) Type;
next += sizeof(Type);
return mem;
}
else
return 0;
}
static Type* allocate( std::size_t nb )
{
if( next+nb*sizeof(Type) <= end )
{
Type* mem = new(next) Type[nb];
next += nb*sizeof(Type);
return mem;
}
else
return 0;
}
static void release( Type* ptr ) { ptr->~Type(); }
static void release( Type* ptr, std::size_t nb )
{
// there is nb objects from there
for(std::size_t i=0;i<nb;++i) (ptr++)->~Type();
}
static unsigned char buffer[Size*sizeof(Type)];
static Type* next;
static Type* end;
};
template<class Type, std::size_t Size, std::size_t ID>
unsigned char heapless_allocator<Type,Size,ID>::buffer[Size*sizeof(Type)];
template<class Type, std::size_t Size, std::size_t ID>
Type* heapless_allocator<Type,Size,ID>::next
= (Type*)(&heapless_allocator<Type,Size,ID>::buffer[0]);
template<class Type, std::size_t Size, std::size_t ID>
Type* heapless_allocator<Type,Size,ID>::end
= (Type*)(&heapless_allocator<Type,Size,ID>::buffer[Size]);
struct foo
{
foo() { cout << "allocating foo @" << this << endl; }
~foo() { cout << "deallocating foo @" << this << endl; }
};
int main()
{
foo* mem = heapless_allocator<foo,8>::allocate();
cout << mem << endl;
heapless_allocator<foo>::release(mem);
cout << endl;
mem = heapless_allocator<foo,8>::allocate(7);
cout << mem << endl;
heapless_allocator<foo>::release(mem,7);
cout << endl;
mem = heapless_allocator<foo,8>::allocate();
cout << mem << endl;
cout << endl;
} |
Partager