2016-03-23 14 views
1

Ich möchte eine definierte Zuordnungsgrenze (für meinen μC) haben, um "dynamischen" Speicher zuzuweisen.Benutzerdefinierter Zuordner mit Kompilierzeitarray

Mein Code:

template<class T, size_t COUNT> 
class SimpleAllocator 
{ 
public: 
    using value_type = T; 

    template<class U> 
    struct rebind 
    { 
    using other = SimpleAllocator<U, COUNT>; 
    }; 

    SimpleAllocator() noexcept 
    { 
    } 

    template<class U, size_t COUNT_U> 
    SimpleAllocator(SimpleAllocator<U, COUNT_U> const &other) noexcept 
    { 
    } 

    value_type* allocate(std::size_t p_Count) 
    { 
    return nullptr; 
    } 

    void deallocate(value_type* p_Chunk, std::size_t) noexcept 
    { 
    } 

    T m_Chunks[COUNT]; 
}; 

Wenn ich dieses allocator mit der Smart-Pointer-Funktion: std :: allocate_shared ich einen Compiler-Fehler:

error: constructor for 'SimpleAllocator<std::_Sp_counted_ptr_inplace<int, 
    SimpleAllocator<int, 10>, __gnu_cxx::_Lock_policy::_S_atomic>, 10>' must 
    explicitly initialize the member 'm_Chunks' which does not have a default 
    constructor 

ich diesen Fehler zu verstehen, aber ich kann es nicht lösen. Wie kann ich ein Objekt wie dieses initialisieren:

std::_Sp_counted_ptr_inplace<int, SimpleAllocator<int, 10>, 
    __gnu_cxx::_Lock_policy::_S_atomic> 

Live Example.

+0

Und was haben Sie versucht, das Array zu initialisieren? Wie verwenden Sie die Zuweisungsklasse? Können Sie uns bitte ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) zeigen? –

+0

Nun, mein Live-Beispiel (siehe oben) sollte diese Richtlinie bereits erreichen. Es zeigt den Fehler in einem minimalen Beispiel. Ich möchte meinen * SimpleAllocator * mit std :: allocate_shared verwenden. Welche Informationen benötigen Sie sonst noch? Der Speicherort sollte nicht im Datensegment liegen und nicht innerhalb des Heapspeichers zugewiesen werden, da er in einem μC verwendet wird. – Viatorus

Antwort

1

Sie wollen nicht initialisiert werden alle Objekte in Allocator, müssen Sie nur Speicher zuzuweisen. So müssen Sie diese ersetzen

T m_Chunks[COUNT]; 

mit zum Beispiel

alignas(T) char m_Chunks[COUNT * sizeof(T)]; 

und aktualisieren alle die Buchhaltung entsprechend (die Sie haben nicht gezeigt).

Das heißt, ein Puffer direkt in einem Zuordner selbst ist keine gute Idee (es sei denn, Sie wissen genau, was Sie tun). Der Allokator sollte ein leichtes Objekt sein, da er nach Wert in Containern gespeichert ist und während vieler Operationen kopiert wird.

Verwandte Themen