Dies wird mit einem std::map um die Leistung in einer engen Schleife zu verbessern.
Code: Select all
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;
}
Mir ist bewusst, dass Zuweisungen nach Wert kopiert werden. Ich sehe, dass ich eine gemeinsam genutzte Instanz des Allokatorstatus (aktueller Offset im Speicherblock) behalten möchte, aber mir ist nicht klar, welches Muster dafür am besten geeignet ist.
Welches Muster verwenden andere für dieses Problem?