Учитывая, что распределители копируются по значению, как распределяется состояние распределителя?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Учитывая, что распределители копируются по значению, как распределяется состояние распределителя?

Сообщение Anonymous »

Я реализовал специальный распределитель, который берет блок памяти из стека и линейно распределяет его, игнорируя вызовы освобождения. Это используется с std::map для повышения производительности в узком цикле.

Код: Выделить всё

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;
}
Независимо от того, является ли это лучшим алгоритмическим решением, проблема, с которой я сталкиваюсь, заключается в том, что распределитель копируется по значению во время операции повторной привязки, копируется состояние и передается исходный экземпляр распределителя. in не видит изменений состояния по мере выделения.
Я понимаю, что распределители копируются по значению. Я вижу, что мне нужно сохранить общий экземпляр состояния распределителя (текущее смещение в блоке памяти), но я не знаю, как лучше всего это сделать.
Какой шаблон используют другие для решения этой задачи?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ate-shared
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»