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?
 Mobile version
 Mobile version