2013-04-21 24 views
5

STLはdeque implementation、ブーストdeque implementationです。しかし、どちらもシーケンスコンテナ(アロケータによる動的割り当て)のSTLの方法を使用します。C++静的に割り当てられたダブルエンドキュー実装

私は信頼性が高く、高速で静的に割り当てられたdeque実装を探しています。これは次のようになります。

template<typename T, unsigned int S> 
class StaticDeque 
{ 
    T m_elements[S]; 
}; 

すべての要素は静的に割り当てられます。

注1:STLベースのソリューション(ベクタとデュークのデータを静的に割り当てるカスタムアロケータを使用しています)がありますが、より良いソリューション(実行時間の短縮)を探しています。

注2:メモリ内の定義済み(高速アクセス)領域のデータを処理するため、静的に割り当てられたメモリが必要です。だから、オブジェクトは次のように宣言されます:#pragma DATA_SECTION("fast_memory")StaticDeque<int, 10> payloads;

+2

あなたの質問は何ですか?基本的には、キューの現在の端を示す2つのインデックスを持つ循環バッファが必要です。 –

+0

デキューへのマルチスレッドアクセスが必要ですか? –

+1

あなたはフロントを置いて自分のリングバッファを作ることができ、簡単にバックファンクションを置くことができます。 stlデッキには、dinammicalyリンクリストに対処するためのオーバーヘッドがたくさんあります。 –

答えて

2

あなたはmodified allocatorで既存のstd::deque実装を再利用するハワードヒナントのstack allocatorを使用することができます。スタック上にcharの配列を保持する、いわゆるアリーナオブジェクトを含む、アロケータのコンストラクタに任意のメモリを与えることができます。アリーナクラスの小さな変更によって、ヒープ上に静的に割り当てられたメモリを含むアリーナオブジェクトを使用することもできます。

現在、アリーナオブジェクトが保持するメモリ量が使い果たされた場合、::operator newが呼び出され、ヒープに余分なメモリが割り当てられるため、100%スタティックスキームではありません。おそらく、C++ 14でランタイムサイズの配列を使用すると、これを緩和することができます。当面は、std::deque(アプリケーションのプロファイリングに基づく)に十分なメモリを事前に割り当てて予約してください。

利点は、このアロケータを任意のSTLコンテナで使用でき、コンテナを正確かつ効率的に取得することを心配するのではなく、メモリの問題のみに集中できることです。

関連する問題