Seite 1 von 1

Eigener 'Stack' in C++

Verfasst: 22.12.2013, 15:54
von dronus
Hallo,

ich versuche seit Tagen erfolglos eine eigene explizite Variante des User-Stacks zu programmieren. Grund ist, dass ich in einer rekursiven Berechnung eine weitere Baumstruktur verwende, die aber nicht unbedingt in der selben Richtung (höher oder tiefer im Baum) durchlaufen wird wie die Rekursion im Programmablauf. Außerdem verspreche ich mir davon, eine rekursive Verarbeitung unterbrechen, fortsetzen und auf mehrere Threads umverteilen zu können.

Ich brauche nicht die ganze Flexibilität des echten Stacks, aber es sollte in etwa sowas geben:

Code: Alles auswählen

class StackFrame
{
   ....
}

class Stack
{
public:
    void push(StackFrame& frame);
    StackFrame pop();
    StackFrame* peek();
}
wobei die eigentlichen Objekte von StackFrame abgeleitet werden.

Nun das große Problem: Der Stack kann die Objekte nicht in einem Array StackFrame stack[] oder STL-vector oder oder oder speichern, weil die Objekte ja abgeleitet und dann verschieden groß sind. Ich kann sie auch nicht 'von Hand' in einen Speicher legen, weil ich in C++ keine Möglichkeit sehe, zur Laufzeit die echte Größe des Objektes herauszufinden.

Zwar kann man den new-Allokator überladen, und dann mit StackFrame* s=new(stack) StackFrame(); das Objekt 'pushen', aber dann gibt es keinen überladbaren delete-Operator dazu, und es fehlt die klassische 'push', 'pop' Semantik.

Andere schlugen mir vor, std::shared_ptr's in einem std::vector zu speichern, aber dann sind die echten Objekte ja auf dem Heap letztlich mit malloc reserviert, und nur die Pointer darauf effizient auf dem Stack reserviert. Das ist nicht Sinn der Sache... ich hätte gerne die echten Objekte linear im Speicher abgelegt, um sie effizient pushen und poppen zu können.

Kann man da was machen?

Re: Eigener 'Stack' in C++

Verfasst: 22.12.2013, 16:03
von Krishty
Arbeitest du unter Windows? Dann solltest du Fibers ausprobieren. Sonst hat C++’ STL AFAIK so etwas wie Coroutines, die du ebenfalls nutzen kannst. Dann musst du keinen eigenen Stapel programmieren.

Re: Eigener 'Stack' in C++

Verfasst: 22.12.2013, 16:27
von dronus
Ich würde gerne so platform-befreit wie möglich agieren.. C++ und OpenGL compiliert sich auch für Waschmaschinen und Webbrowser :-p

Re: Eigener 'Stack' in C++

Verfasst: 22.12.2013, 16:37
von dronus
Hab grad nachgesehen, STL hat keine Coroutinen. Es gibt aber C++-Fiesematenten mit denen man Coroutinen schreiben kann bzw. Bibliotheken dafür (in BOOST bestimmt auch). Dennoch würde ich den eigenen Stapel vorziehen, auch weil er die Daten optimal zugreifbar macht für Debugging, Serialisierung, peek in ältere Stack-Frames usw.

Re: Eigener 'Stack' in C++

Verfasst: 23.12.2013, 05:02
von dronus
Das mit der Thread-Verteilung hab ich erstmal ad acta gelegt, und das Problem mit den Richtungen auch. Was bleibt ist die Schwierigkeit verschieden große Kindobjekte auf den Stack zu legen, und das mache ich jetzt tatsächlich erstmal mit dem normalen User Stack.

Damit ich keine Container irgendeiner Art für die Kindobjekte brauche, habe ich eine zentrale Rekursionsstruktur gebaut, mit der man verschiedene Funktionen nach dem Visitor-Prinzip einklinken kann. Damit gibt es gar keine Container mehr, sondern es liegt immer nur ein Objekt pro Rekusionsebene auf dem Stack, sobald der nächste Kindknoten verarbeitet wird ist der letzte schon vergessen.