2013-04-21 13 views
5

STL hat deque implementation, Boost deque implementation; Beide verwenden jedoch den STL-Weg der Sequenzcontainer (dynamische Zuordnung mit Allokatoren).C++ statisch zugewiesene Doppelschlangenimplementierung

Ich suche eine zuverlässige, schnelle und statisch zugeordnete Deque-Implementierung. Das sieht in etwa so aus:

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

Also alle Elemente statisch zuzuordnen.

Anmerkung1: Ich habe bereits eine STL-basierte Lösung (mit benutzerdefinierten Zuordnern, die statisch Daten für Vektor und Deque zuweisen), aber ich suche nach einer besseren Lösung (niedrigere Ausführungszeit).

Anmerkung2: Ich brauche statisch zugewiesenen Speicher, da ich Daten in einem vordefinierten (schnellen Zugriff) Bereich im Speicher handhabe. So wird Objekt wie folgt erklärt werden: #pragma DATA_SECTION("fast_memory")StaticDeque<int, 10> payloads;

+2

Also, was ist deine Frage? Grundsätzlich möchten Sie einen zyklischen Puffer mit zwei Indizes, die die aktuellen Enden der Warteschlange markieren. –

+0

Benötigen Sie Multithread-Zugriff auf Deque? –

+1

Sie können Ihren eigenen Ringpuffer mit Put-Front- und Put-Back-Funktionen erstellen. Ein stl Deque hat viel Aufwand, um mit Dinamically verknüpften Listen umzugehen. –

Antwort

2

Sie könnten Howard Hinnant des stack allocator verwenden, die die bestehenden std::deque Implementierung mit einem modified allocator wieder verwendet. Sie können dem Konstruktor des Zuordners ein beliebiges Stück Speicher hinzufügen, einschließlich eines sogenannten arena-Objekts, das ein Array von Zeichen auf dem Stapel enthält. Sie könnten auch ein Arena-Objekt verwenden, das ein statisch zugewiesenes Stück Speicher auf dem Heap enthält, durch eine kleine Modifikation der Arena-Klasse.

Beachten Sie jedoch, dass es derzeit kein 100% statisches Schema ist, da die ::operator new aufgerufen wird, um zusätzlichen Speicher auf dem Heap zuzuweisen, wenn die Speichermenge, die das Arena-Objekt enthält, erschöpft ist. Vielleicht in C++ 14 mit runtime-großen Arrays kann dies gemildert werden. Stellen Sie vorerst sicher, dass Sie ausreichend Speicherplatz für Ihre std::deque reservieren und reservieren (basierend auf dem Profil Ihrer Anwendung).

Der Vorteil ist, dass Sie diesen Zuordner mit jedem STL-Container verwenden können, und Sie können sich nur auf die Speicherprobleme konzentrieren, anstatt sich auch darum kümmern zu müssen, den Container richtig und effizient zu erhalten.