Код: Выделить всё
template
struct region_allocator
{
using value_type = T;
region_allocator() = delete;
region_allocator( void* baseAddress, size_t sizeInBytes )
{
m_memBegin = (char*)baseAddress;
m_memCurr = m_memBegin;
m_memEnd = m_memCurr + sizeInBytes;
}
template
constexpr region_allocator( const region_allocator& other ) noexcept
{
m_memBegin = other.m_memBegin;
m_memCurr = other.m_memCurr;
m_memEnd = other.m_memEnd;
}
template
struct rebind
{
using other = region_allocator;
};
T* allocate( std::size_t n )
{
char* address = m_memCurr;
size_t sizeRequired = sizeof( T ) * n;
m_memCurr += sizeRequired;
if( m_memCurr > m_memEnd ) [[unlikely]]
{
m_memCurr -= sizeRequired;
assert( "Out of memory" );
}
return (T*)address;
}
void deallocate( T* p, std::size_t n ) noexcept
{
// don't free; caller will release full block
}
protected:
template
friend struct region_allocator;
char* m_memCurr = nullptr;
char* m_memEnd = nullptr;
char* m_memBegin = nullptr;
};
template
bool operator==( const region_allocator& lhs, const region_allocator& rhs ) noexcept
{
if( lhs.m_memBegin != rhs.m_memBegin )
return false;
if( lhs.m_memEnd != rhs.m_memEnd )
return false;
return true;
}
Я понимаю, что распределители копируются по значению. Я вижу, что мне нужно сохранить общий экземпляр состояния распределителя (текущее смещение в блоке памяти), но я не знаю, как лучше всего это сделать.
Какой шаблон используют другие для решения этой задачи?
Подробнее здесь: https://stackoverflow.com/questions/793 ... ate-shared