Wie wird der Allokatorstatus geteilt, wenn man davon ausgeht, dass Allokatoren nach Wert kopiert werden?C++

Programme in C++. Entwicklerforum
Guest
 Wie wird der Allokatorstatus geteilt, wenn man davon ausgeht, dass Allokatoren nach Wert kopiert werden?

Post by Guest »

Ich habe einen benutzerdefinierten Allokator implementiert, der einen Speicherblock vom Stapel nimmt und ihn linear zuweist, wobei Aufrufe zur Freigabe ignoriert werden.

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;
}
Unabhängig davon, ob dies die beste algorithmische Lösung ist, besteht das Problem, auf das ich stoße, darin, dass der Allokator während des Rebind-Vorgangs nach Wert kopiert wird, der Status kopiert und die ursprüngliche Allokatorinstanz übergeben wird in sieht keine Statusänderungen, wenn Zuweisungen vorgenommen werden.
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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post