5

STL にはdeque 実装、Boost deque 実装があります。しかし、どちらも STL 方式のシーケンス コンテナー (アロケーターによる動的割り当て) を使用しています。

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

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

したがって、すべての要素が静的に割り当てられます。

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

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

4

1 に答える 1

2

変更された allocatorで既存の実装を再利用する Howard Hinnant のstack allocatorを使用できます。スタック上の文字の配列を保持する、いわゆるアリーナ オブジェクトを含む、任意のメモリをアロケータのコンストラクタに提供できます。アリーナ クラスを少し変更することで、ヒープ上に静的に割り当てられたメモリを含むアリーナ オブジェクトを使用することもできます。std::deque

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

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

于 2013-04-22T09:28:50.963 に答える