2016-03-23 8 views
1

"動的"メモリを割り当てるための割り当て制限(myC用)を定義します。コンパイル時の配列を持つカスタムアロケータ

マイコード:

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]; 
}; 

私はスマートポインタ機能で、このアロケータを使用する場合:のstd :: allocate_sharedは、私は、コンパイラのエラーを取得:

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 

私はこのエラーを理解するけどそれを解決することはできません。どのように私はこのようなオブジェクトを初期化することができます

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

Live Example.

+0

配列を初期化しようとしましたか?あなたはどのようにアロケータクラスを使いますか?あなたは私たちに[最小、完全で、そして証明可能な例](http://stackoverflow.com/help/mcve)を見せてもらえますか? –

+0

さて、私のライブの例(上記参照)は、このガイドラインにすでに達しているはずです。これは最小限の例でエラーを示しています。 * SimpleAllocator *をstd :: allocate_sharedと一緒に使いたいです。他にどんな情報が必要ですか?メモリ位置は、データセグメント内にあってはならず、μC内部での使用のためにヒープ内部に割り当てられてはなりません。 – Viatorus

答えて

1

あなたはアロケータ内の任意のオブジェクトを初期化したくない、あなただけのメモリを割り当てる必要があります。だから、例えば

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

この

T m_Chunks[COUNT]; 

を交換し、それに応じて(あなたが示されていない)すべての簿記を更新する必要があります。

つまり、アロケータ自体の中にバッファを置くことは良いことではありません。アロケータは、値によってコンテナに格納され、多くの操作中にコピーされるため、軽量オブジェクトであると考えられます。

関連する問題