Bevor ich mein eigenes schreibe, werde ich euch alle fragen.Suche nach C++ STL-like Vektor-Klasse, aber mit Stack-Speicher
Ich bin auf der Suche nach einer C++ - Klasse, die fast genau wie ein STL-Vektor ist, aber Daten in einem Array auf dem Stapel speichert. Eine Art von STL-Zuweisungs-Klasse würde auch funktionieren, aber ich versuche, jede Art von Heap zu vermeiden, sogar statische zugewiesene Pro-Thread-Heaps (obwohl einer von diesen meine zweite Wahl ist). Der Stapel ist nur effizienter.
Es muss fast ein Ersatz für den aktuellen Code sein, der einen Vektor verwendet.
Für das, was ich wollte mich selbst schreiben war ich von so etwas wie dieses Denken:
char buffer[4096];
stack_vector<match_item> matches(buffer, sizeof(buffer));
Oder die Klasse könnte Pufferraum intern zugeordnet hat. Dann würde es wie folgt aussehen:
stack_vector<match_item, 256> matches;
Ich dachte, es wäre std :: bad_alloc werfen, wenn es der Platz ausgeht, obwohl das nicht immer passieren.
aktualisieren
Mit stack_container.h Chromium funktioniert super!
Der Grund, warum ich nicht daran gedacht hatte, es auf diese Weise selbst zu machen, ist, dass ich den Zuweisungsobjektparameter für die STL-Sammlungskonstruktoren immer übersehen habe. Ich habe den Vorlagenparameter ein paar Mal benutzt, um statische Pools zu machen, aber ich habe nie Code gesehen oder geschrieben, der tatsächlich den Objektparameter benutzte. Ich habe etwas Neues gelernt. Sehr cool!
Der Code ist ein bisschen chaotisch und aus irgendeinem Grund zwingt GCC mich, den Allokator als ein tatsächliches Element zu deklarieren, anstatt es in Vektor-Allokator-Parameter zu konstruieren. Es ging von etwas wie folgt aus:
typedef std::pair< const char *, const char * > comp_list_item;
typedef std::vector<comp_list_item> comp_list_type;
comp_list_type match_list;
match_list.reserve(32);
Um dies:
static const size_t comp_list_alloc_size = 128;
typedef std::pair< const char *, const char * > comp_list_item;
typedef StackAllocator< comp_list_item, comp_list_alloc_size > comp_list_alloc_type;
typedef std::vector< comp_list_item, comp_list_alloc_type > comp_list_type;
comp_list_alloc_type::Source match_list_buffer;
comp_list_alloc_type match_list_alloc(&match_list_buffer);
comp_list_type match_list(match_list_alloc);
match_list.reserve(comp_list_alloc_size);
Und ich muss wiederholen, dass, wenn ich ein neues erklären. Aber es funktioniert so, wie ich es wollte.
Ich habe festgestellt, dass stack_container.h hat einen StackVector definiert und ich habe es versucht. Aber es erbt nicht vom Vektor oder definiert die gleichen Methoden, also war es kein Ersatz. Ich wollte nicht den ganzen Code mit dem Vektor umschreiben, also gab ich es auf.
Nur um zu verdeutlichen, möchten Sie etwas, das im Wesentlichen ein Vektor ist, aber mit einer festen Kapazität als Teil der Vorlage Argumente? –
Interessante Idee ... –
StackVector hat eine Methode, um Ihnen den tatsächlichen std :: vector zu geben. mach einfach StackVector :: ContainerType & v = stack_vector.container(); es bekommen. v ist dann ein tatsächlicher std :: vector. verwende auch besser den Gewerkschaftstrick, den ich im Kommentar zu meiner Antwort erklärt habe. –